将字符串解码为整数列表

时间:2013-02-01 23:18:08

标签: javascript

如何将长度为4的倍数的字符串解码为javascript中的32位整数列表?

在python中与struct.unpack('> 16I,16characterstring)等效的东西。 我可以使用常见的外部库。我正在寻找一些干净的东西,希望能避免位移和操纵。

实施例,

"deadbeef" -> (1684365668, 1650812262)

"dead" -> [1684365668]
"beef" -> [1650812262]

3 个答案:

答案 0 :(得分:1)

https://github.com/vjeux/jParser怎么样 - 这个图书馆看起来很有希望。

答案 1 :(得分:1)

这是一种略有不同的方法 - 不需要字符类型。使用乘法作为位移技术。我写了它,所以当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标准的浏览器;并且是大端。

答案 2 :(得分:0)

这使用HTML5类型的数组,因此它需要modern browser

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