将DataView与Node.js缓冲区一起使用

时间:2019-08-09 11:45:29

标签: javascript node.js

我正在尝试使用DataView对象读取/写入一些二进制数据。从</body>初始化缓冲区时,它似乎正常工作,但是如果将它传递给nodejs UInt8Array对象,则结果似乎不正确。我使用API​​的方式不正确吗?

Buffer

带有缓冲区的那个失败


    import { expect } from 'chai';

    describe('read binary data', () => {

      it('test buffer', () => {
        let arr = Buffer.from([0x55,0xaa,0x55,0xaa,0x60,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1c,0xd0,0xbb,0xd3,0x00,0x00,0x00,0x00])
        let read = new DataView(arr.buffer).getUint32(0, false);
        expect(read).to.eq(0x55aa55aa);
      })

      it('test uint8array', () => {
        let arr = new Uint8Array([0x55,0xaa,0x55,0xaa,0x60,0x00,0x00,0x00,0xd4,0x03,0x00,0x00,0x1c,0xd0,0xbb,0xd3,0x00,0x00,0x00,0x00])
        let read = new DataView(arr.buffer).getUint32(0, false);
        expect(read).to.eq(0x55aa55aa);
      })

    })

2 个答案:

答案 0 :(得分:0)

这有所帮助(不确定这是否最优雅):

const buff = Buffer.from(msgBody, 'base64');
let uint8Array = new Uint8Array(buff.length);
for(let counter=0;counter<buff.length;counter++) {
    uint8Array[counter] = buff[counter];
    //console.debug(`uint8Array[${counter}]=${uint8Array[counter]}`);
}
let dataview = new DataView(uint8Array.buffer, 0, uint8Array.length);

答案 1 :(得分:0)

试试用这个buf.copy

const buf = fs.readFileSync(`...`);
const uint8arr = new Uint8Array(buf.byteLength);

buf.copy(uint8arr, 0, 0, buf.byteLength);
const v = new DataView(uint8arr.buffer);