繁体   English   中英

如何从 javascript 中的任意字节开始从字节数组转换为不同的数字类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM