如何将长度为 4 的倍数的字符串解码为 javascript 中的 32 位整数列表?
在 python 中相当于 struct.unpack('>16I, 16characterstring) 的东西。我可以使用通用的外部库。我正在寻找一些干净的东西,希望能避免位移和操纵。
例子,
"deadbeef" -> (1684365668, 1650812262)
"dead" -> [1684365668]
"beef" -> [1650812262]
如何将长度为 4 的倍数的字符串解码为 javascript 中的 32 位整数列表?
在 python 中相当于 struct.unpack('>16I, 16characterstring) 的东西。我可以使用通用的外部库。我正在寻找一些干净的东西,希望能避免位移和操纵。
例子,
"deadbeef" -> (1684365668, 1650812262)
"dead" -> [1684365668]
"beef" -> [1650812262]
https://github.com/vjeux/jParser怎么样- 这个库看起来很有希望。
这是一种略有不同的方法 - 不需要字符类型。使用乘法作为位移技术。我写了它,所以当 str.length 不是 4 的倍数时它仍然可以工作 - 但事实上你确实在你的问题中声明它会......
注意 - 我没有尝试做“聪明的编码” - 所以我确保事情是明确分配的,一次一个语句,......你可能会想出一种更紧凑的方式来实现同样的事情。不过,这应该会给您一些启发。
function stringToIntArray(str) {
var l = Math.ceil(str.length/4); // not needed if you are sure it's a multiple of 4
var opArray = new Array(l); // known length - miniscule speed advantage?
var ii=0, jj=0, charCounter=0; // ii loops over 4-char word-of-interest
// jj counts elements in the output array
// charCounter points to the current character
opArray[0]=0;
while( charCounter < str.length ) {
ii = charCounter % 4; // count 0, 1, 2, 3, 0, 1, 2, 3...
opArray[jj] *= 256; // left shift 8 bits
opArray[jj] += str.charCodeAt(charCounter); // add next code
if(ii==3) {
opArray[++jj]=0;
}
charCounter++;
}
return opArray;
}
var myval = stringToIntArray("deadbeef");
alert("'dead' turns into " + myval[0] + "\n'beef' turns into " + myval[1]);
输出:
'dead' turns into 1684365668
'beef' turns into 1650812262
结果符合预期;不需要兼容 HTML5 的浏览器;并且是大端。
这使用 HTML5 类型的数组,因此它确实需要现代浏览器
function strToU32(str) {
var u8 = new Uint8Array(str.length);
str.split("").forEach(function(char,i){
var code = char.charCodeAt(0);
u8[i] = code;
})
var u32 = new Uint32Array(u8.buffer);
return u32;
}
用法:
var integers = strToU32("abcdefgh");
console.log(integers[0]); // returns 1684234849
console.log(integers[1]); // returns 1751606885