2016-04-24 287 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