[英]How do I convert from a byte array to different number types starting at arbitrary byte starts in javascript
我正在使用文件缓冲区并开始将其作为字节数组处理:
//data is a buffer from reading my file
let view = new Uint8Array(data);
我想要一些基本上类似于 DataView 类的函数,但它使用字节偏移量,而不是基于转换类型的偏移量。
例如,让我们说字节数组是 [0 1 2 3 4 5 6] (抱歉,不确定如何在代码中初始化它)
我想要这样的代码:
let int16_value = view.getUint16(1);
结果为 513,或 1 + 256*2
我认为这可能有效,但问题是它从第二个 uint16 值开始,而不是从第二个字节开始
let view2 = new DataView(data);
let temp = view2.getUint16(1);
我想要所有不同转换的解决方案(uint16、uint32、int16、single、double 等)
我的印象是,如果不手动编写转换,这是不可能的,但我对 javascript 很陌生,想知道是否有一些巧妙的数组切片/复制解决方案,您可以获得这样的东西:
let temp = typecast(view,1,'uint16');
typecast
接受字节数组、开始(以字节为单位)和要提取的数据类型。
如果有一个很好的解决方案可以增加要读取的元素数量,默认值为 1(如上所示),则奖励积分
问题是它从第二个 uint16 值开始。
不,偏移量以字节为单位。
您可以在构建 DataView 时声明偏移量(也以字节为单位)
new DataView(buffer, offset);
但是在这个上调用getUint16(0)
将与在你的上调用getUint16(1)
做同样的getUint16(1)
。
但是从您的预期结果 ( 513
) 看来,您似乎希望 LittleEndian 成为默认值。 默认值实际上是 BigEndian,您需要将true
传递给DataView.getUint16(offset, littleEndian)
的第二个参数。
// They all return the same value const data = new Uint8Array([0, 1, 2, 3, 4, 5, 6]).buffer; const fullView = new DataView(data); console.log("offset @ get", fullView.getUint16(1, true)); const offsetView = new DataView(data, 1); console.log("offset @ DataView", offsetView.getUint16(0, true)); // offset is made at the buffer level // (just to show it's the same, don't actually do that) const noOffsetData = new Uint8Array([1, 2, 3, 4, 5, 6]).buffer; const noOffsetView = new DataView(noOffsetData); console.log("offset @ buffer", noOffsetView.getUint16(0, true));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.