2017-04-10 31 views
2

如果需要的話,將給定(無符號)整數轉換爲大字節和填充的四字節數組,最穩定和最簡單的方法是什麼?下面是一個例子:將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));

說實話我不喜歡我的初始代碼。然後,根據您的評論,我提出了另一個更簡單的解決方案。首先我使用一個工具將十進制轉換爲十六進制,並按照相反的順序進行轉換。它叫做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)));

您可以在十進制數爲十六進制十六進制數字十六進制(255 - >爲0xFF)皈依在dec2hex功能很好,但我想到一個可能感興趣的十進制數每個字節的表示,所以留下一個稍後階段..

+0

謝謝,減少,這是你在那裏的一些嚴重的魔法! ;)我會盡量調整你的解決方案,以便它返回一個字節數組。我想我沒有在我的例子中清楚地闡述它,我需要一個字節數組,例如var * myArray = [0xca,0x02,0x00,0x00]; * – Robert

+0

好吧,我有點困惑......我可以假設你想用相應的字節值填充數組..我已經補充了我的答案,請檢查我是否接近。 – Redu

+0

是的,這正是我想要實現的。它現在有用,再次感謝! – Robert

相關問題