2016-04-24 286 views
1

我想將整數(有符號)轉換爲32位(大端)到八位字節流中,並將八位字節流作爲數組值賦予緩衝區對象的構造函數。Javascript將int值轉換成八位字節流數組

我可以在控制檯創建例如用於值-2000:

<code> 
buf = Buffer(4) 
buf.writeInt32BE(-2000) 
buf // is <Buffer ff ff f8 30> 
buf1 = new Buffer([0xff, 0xff, 0xf8, 0x30]) 
</code> 

值-3000是例如-3000:爲0xFF,0xFF時,0xF4中,0x48

但框架我使用不接受writeInt32BE函數並拋出異常。

如何將一個32位整數值轉換爲八位字節數組流,而不使用writeInt32BE?

一個函數,它接受一個值並返回一個八位字節流數組。

+0

'緩衝區'是由Node提供的全局,而不是框架。所以你不應該用'(Buffer instance).writeInt32BE()'得到有效參數的異常。什麼_exact_代碼導致異常,它在Node中運行,框架是什麼? – traktor53

回答

1

使用一個4字節的數組緩衝區,轉換爲數據視圖,並在視圖上調用setInt32似乎工作。這種方法支持與機器體系結構無關的小端和大端(默認)格式的規範。

function bigEnd32(value) { 
    var buf = new ArrayBuffer(4); 
    var view = new DataView(buf); 
    view.setInt32(0, value); 
    return view; 
} 

// quick test (in a browser) 
var n = prompt("Signed 32: "); 
var view = bigEnd32(+n); 
for(var i = 0 ; i < 4; ++i) 
    console.log(view.getUint8(i)); 

文檔位於搜索「MDN ArrayBuffer」「MDN數據視圖」等等看看詳細DataView爲訪問底層數組緩衝性能 - 你可能能夠調整代碼適合你的應用程序。

+0

當我打印它與getInt32(我)它導致RangeError:實際上我想轉換-2000 –

+0

底層緩衝區包含4個八位字節。 'view.getInt32(0)'將其值作爲32位整數返回。將非零偏移量傳遞給getInt32將導致範圍錯誤。測試代碼中的'+ n'將字符串轉換爲數字,而不是將負數轉換爲正數。如預期的那樣,-2000給出0xff 0xff 0xf8 0x30。 – traktor53