ArrayBuffer到TypedArray在访问时不显示任何内容。

时间:2017-02-03 19:03:10

标签: javascript node.js serial-port

我正在运行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]);
}

让我知道你的想法。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

由于says on MDN,您无法直接操纵ArrayBuffer的内容。因此,当您分配到testArrayBuffer[0]时,您实际上并未将其放入缓冲区;你只是在对象上创建一个名为"0"的属性。这是微不足道的证明:

&#13;
&#13;
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;
&#13;
&#13;

如果要分配单个字节,可以使用Uint8Array(或Int8Array)进行分配。

这里的代码实际上是通过Uint8Array写入数组缓冲区的;正如您所看到的,当您稍后将其视为Uint16Array时,您会看到这些位已设置,并且当您将它们视为16位字而不是8位字节时,您会看到它们的不同解释:

&#13;
&#13;
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;
&#13;
&#13;