1

javascriptで長さが4の倍数の文字列を32ビット整数のリストにデコードするにはどうすればよいですか?

Python の struct.unpack('>16I, 16characterstring) に相当するもの。一般的な外部ライブラリを使用しても問題ありません。私はきれいなものを探しています。うまくいけば、ビットシフトと操作を回避できます。

例、

"deadbeef" -> (1684365668, 1650812262)

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

3 に答える 3

1

これは少し異なるアプローチです - 文字型は必要ありません。ビット シフト手法として乗算を使用します。str.length が 4 の倍数でない場合でも機能するように書きましたが、実際には質問で次のようになると述べました...

注 - 私は「巧妙なコーディング」をしようとはしませんでした。そのため、一度に 1 ステートメントずつ明示的に割り当てるようにしました。しかし、これはあなたにいくつかのインスピレーションを与えるはずです.

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 準拠のブラウザーは必要ありません。そしてビッグエンディアンです。

于 2013-02-02T02:04:10.513 に答える
0

これは 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
于 2013-02-01T23:36:10.567 に答える