Here’s a very basic pack() in JavaScript that allows you to easily write binary data. It uses the same format characters as in PHP’s pack() function, but it doesn’t support all of them and it surely doesn’t support repeater arguments.
function pack(fmt) {
var output = '';
var argi = 1;
for (var i = 0; i < fmt.length; i++) {
var c = fmt.charAt(i);
var arg = arguments[argi];
argi++;
switch (c) {
case "a":
output += arg[0] + "\0";
break;
case "A":
output += arg[0] + " ";
break;
case "C":
case "c":
output += String.fromCharCode(arg);
break;
case "n":
output += String.fromCharCode((arg >> 8) & 255, arg & 255);
break;
case "v":
output += String.fromCharCode(arg & 255, (arg >> 8) & 255);
break;
case "N":
output += String.fromCharCode((arg >> 24) & 255, (arg >> 16) & 255, (arg >> 8) & 255, arg & 255);
break;
case "V":
output += String.fromCharCode(arg & 255, (arg >> 8) & 255, (arg >> 16) & 255, (arg >> 24) & 255);
break;
case "x":
argi--;
output += "\0";
break;
default:
throw new Error("Unknown pack format character '"+c+"'");
}
}
return output;
}
var output = '';
var argi = 1;
for (var i = 0; i < fmt.length; i++) {
var c = fmt.charAt(i);
var arg = arguments[argi];
argi++;
switch (c) {
case "a":
output += arg[0] + "\0";
break;
case "A":
output += arg[0] + " ";
break;
case "C":
case "c":
output += String.fromCharCode(arg);
break;
case "n":
output += String.fromCharCode((arg >> 8) & 255, arg & 255);
break;
case "v":
output += String.fromCharCode(arg & 255, (arg >> 8) & 255);
break;
case "N":
output += String.fromCharCode((arg >> 24) & 255, (arg >> 16) & 255, (arg >> 8) & 255, arg & 255);
break;
case "V":
output += String.fromCharCode(arg & 255, (arg >> 8) & 255, (arg >> 16) & 255, (arg >> 24) & 255);
break;
case "x":
argi--;
output += "\0";
break;
default:
throw new Error("Unknown pack format character '"+c+"'");
}
}
return output;
}
I'm on Twitter!
thanks, this was helpful