我正在运行node.js并使用serialport模块为javascript读取字节。我有一个已知的消息结构,其中一些东西是1,2或x字节长。 我想将每个字节读入ArrayBuffer的一个元素。然后,当我有我需要的东西时,我要制作一个TypedArray并访问这些值。
如果有更好的方法,请告诉我。 我的问题是我可以看到ArrayBuffer中每个字节的正确hex / base10设置,但是当我创建一个TypedArray并尝试访问元素时,我得到的所有条目都为零。
贝娄是我为测试而做的一些玩具代码。我不理解这些数据结构的正确使用吗?
stateMachine.stop();
stateMachine
.getStateMachineAccessor()
.doWithAllRegions(access ->
access.resetStateMachine(new DefaultStateMachineContext<>(startingState, null, null, null)));
stateMachine.start();
这给了我以下输出:(注意typedarray全是零)
var testArrayBuffer = new ArrayBuffer(8);
testArrayBuffer[0] = 0xFF;
testArrayBuffer[1] = 0xFF;
testArrayBuffer[2] = 0x00;
testArrayBuffer[3] = 0xFF;
testArrayBuffer[4] = 0x00;
testArrayBuffer[5] = 0x09;
testArrayBuffer[6] = 0x01;
testArrayBuffer[7] = 0x00;
console.log('testArrayBuffer.byteLength : ', testArrayBuffer.byteLength);
for(var i=0; i<8; i++)
{
console.log('testArrayBuffer[', i, '].toString(16) : ', testArrayBuffer[i].toString(16));
console.log('testArrayBuffer[', i, '].toString(10) : ', testArrayBuffer[i].toString(10));
console.log('testArrayBuffer[', i, '].toString() : ', testArrayBuffer[i].toString());
console.log('testArrayBuffer[', i, '] : ', testArrayBuffer[i]);
}
var testTypedArray = new Uint16Array(testArrayBuffer, 0, 4)
console.log('testTypedArray.length : ', testTypedArray.length);
for(var j=0; j<4; j++)
{
console.log('testTypedArray[', j, '].toString(16) : ', testTypedArray[j].toString(16));
console.log('testTypedArray[', j, '].toString(10) : ', testTypedArray[j].toString(10));
console.log('testTypedArray[', j, '].toString() : ', testTypedArray[j].toString());
console.log('testTypedArray[', j, '] : ', testTypedArray[j]);
}
让我知道你的想法。
感谢您的时间。
答案 0 :(得分:0)
由于says on MDN,您无法直接操纵ArrayBuffer
的内容。因此,当您分配到testArrayBuffer[0]
时,您实际上并未将其放入缓冲区;你只是在对象上创建一个名为"0"
的属性。这是微不足道的证明:
var buf = new ArrayBuffer(1);
var byteArray = new Uint8Array(buf);
console.log(byteArray[0]); // "0"
buf[0] = 42;
console.log(byteArray[0]); // Still "0"
console.log(buf[0]); // "42"
// Proof that "0" is a property on the object:
for (var n in buf) {
console.log(n + " is " + buf[n]); // "0 is 42"
}
&#13;
如果要分配单个字节,可以使用Uint8Array
(或Int8Array
)进行分配。
这里的代码实际上是通过Uint8Array
写入数组缓冲区的;正如您所看到的,当您稍后将其视为Uint16Array
时,您会看到这些位已设置,并且当您将它们视为16位字而不是8位字节时,您会看到它们的不同解释:
var testArrayBuffer = new ArrayBuffer(8);
var byteArray = new Uint8Array(testArrayBuffer);
byteArray[0] = 0xFF;
byteArray[1] = 0xFF;
byteArray[2] = 0x00;
byteArray[3] = 0xFF;
byteArray[4] = 0x00;
byteArray[5] = 0x09;
byteArray[6] = 0x01;
byteArray[7] = 0x00;
console.log('testArrayBuffer.byteLength : ', testArrayBuffer.byteLength);
for(var i=0; i<8; i++)
{
console.log('byteArray[', i, '].toString(16) : ', byteArray[i].toString(16));
console.log('byteArray[', i, '].toString(10) : ', byteArray[i].toString(10));
console.log('byteArray[', i, '].toString() : ', byteArray[i].toString());
console.log('byteArray[', i, '] : ', byteArray[i]);
}
var testTypedArray = new Uint16Array(testArrayBuffer, 0, 4)
console.log('testTypedArray.length : ', testTypedArray.length);
for(var j=0; j<4; j++)
{
console.log('testTypedArray[', j, '].toString(16) : ', testTypedArray[j].toString(16));
console.log('testTypedArray[', j, '].toString(10) : ', testTypedArray[j].toString(10));
console.log('testTypedArray[', j, '].toString() : ', testTypedArray[j].toString());
console.log('testTypedArray[', j, '] : ', testTypedArray[j]);
}
&#13;