2

与えられた(符号なしの)整数を、ビッグエンディアンとパディング付きの4バイト配列に変換する最も安定した、最も簡単な方法は何ですか?ここでは例を示します。32ビット符号なし整数をビッグエンディアンバイト配列に変換する最も安定した方法は?

入力値: 714

出力:ところでこのバイト配列 [ 0xca, 0x02, 0x00, 0x00 ];

:あまりにも、罰金だろうこれを行うことが可能であるNPMモジュール。

背景:このバイト配列は、node.jsのTCPソケットを介して送信するXMLメッセージのプレフィックスとして必要です。だから、私はプレフィックスを置く送信バッファ(バイト配列)を持って、その後、バッファの残りの部分は、XMLメッセージのバイトでいっぱいになります。

+0

あなたの例は、ビッグエンディアンに変換されていないのですか? '0x2ca'から 'ca 02 00 00' ..? – Redu

+0

あなたはもちろんそうです...それを修正しました。ありがとう! – Robert

答えて

1

次の関数は、ビッグエンディアン形式の文字列を与える必要があります。

function toBigEndian(n){ 
 
    return n.toString(16) 
 
      .match(/[\da-f]/g) 
 
      .reduceRight((r,c,i,a) => (a.length-i)%2 ? r.concat(c) : (r[r.length-1] = c + r[r.length-1],r),[]) 
 
      .map(s => s.length === 1 ? 0+s : s) 
 
      .reduce((p,c,i,a) => i < a.length-1 ? p + " " + c : p + " " + c + " 00".repeat(~~((4-a.length)))); 
 
} 
 

 
console.log(toBigEndian(714)); 
 
console.log(toBigEndian(20171453));

私は私の最初のコードを好きではなかった正直に言うと。あなたのコメントによれば、私は別の、もっと簡単な解決策を考え出しました。まず、必要な逆の順序で10進数から16進数に変換するツールを使用します。それはdec2hexと呼ばれています。ものすごく単純。

function dec2hex (n){ 
 
    return n ? [n%256].concat(dec2hex(~~(n/256))) : []; 
 
} 
 

 
console.log(JSON.stringify(dec2hex(255))); 
 
console.log(JSON.stringify(dec2hex(256))); 
 
console.log(JSON.stringify(dec2hex(714))); 
 
console.log(JSON.stringify(dec2hex(65535))); 
 
console.log(JSON.stringify(dec2hex(65536)));

は、したがって、上記の dec2hexツールを利用することにより、我々は非常に単純に私たちの仕事を達成することができます。

function dec2hex (n){ 
 
    return n ? [n%256].concat(dec2hex(~~(n/256))) : []; 
 
} 
 

 
function toBigEndian(n){ 
 
    var hexar = dec2hex(n); 
 
    return hexar.map(h => (h < 16 ? "0x0" : "0x") + h.toString(16)) 
 
       .concat(Array(4-hexar.length).fill("0x00")); 
 
} 
 

 
console.log(JSON.stringify(toBigEndian(714)));

あなたは16進数で進10進数で進を含めることができます - だけでなくdec2hex関数内(255> 0xffの)convertionが、私は1つが10進数で興味があるかもしれないと思っています各バイトの表現は後の段階で残します。

+0

ありがとう、Redu、これはあなたがそこにある深刻な魔法です! ;)バイト配列を返すようにソリューションを適応させようとします。私は私の例で十分に明確に定式化していないと思う、私はvar * myArray = [0xca、0x02、0x00、0x00]; * – Robert

+0

のようなバイトの配列が必要です私はちょっと混乱しています...私は仮定してもよい対応するバイト値で配列を埋めたいと思っています..?私は私の答えに加えて、私が近づいているかどうかを確認してください。 – Redu

+0

はい、それは私が達成したいことです。それは今、再びありがとう! – Robert

関連する問題