Javascript 我可以在偏移处参照ArrayBuffer吗?
我将数据从JavaScript变量转换为Javascript 我可以在偏移处参照ArrayBuffer吗?,javascript,typed-arrays,Javascript,Typed Arrays,我将数据从JavaScript变量转换为ArrayBuffer并返回。想想这个函数: function numberToArrayBuffer(number) { return new Float64Array([number]).buffer; } 另一方面: function numberFromArrayBuffer(buffer) { // Assuming implicitly, that the buffer is long enough return n
ArrayBuffer
并返回。想想这个函数:
function numberToArrayBuffer(number) {
return new Float64Array([number]).buffer;
}
另一方面:
function numberFromArrayBuffer(buffer) {
// Assuming implicitly, that the buffer is long enough
return new Float64Array(buffer, 0, 1)[0];
}
这是可行的,但想象一下,你把更多的这些数字塞进Blob中:
var numbers = new Blob([numberToArrayBuffer(66), numberToArrayBuffer(666), numberToArrayBuffer(NaN)], {type:"binary/Float64Array"});
如果您使用文件读取器读取,您可以再次获得ArrayBuffer
:
var fl = new FileReader();
fl.onload = function() {
console.log(Float64Array(this.result));
}
fl.readAsArrayBuffer(numbers);
你会得到这样的结果:
Float64Array { 0=66, 1=666, 2=NaN}
var num2 = byteFromArrayBuffer(buffer, 8);
当然,也可能有不同类型的序列,比如2unrestricteddouble
s和4uint32\u t
。所以我想这样做(但是没有.offset
metod):
当然,我可以创建一个“重载函数”:
然后像这样使用它:
Float64Array { 0=66, 1=666, 2=NaN}
var num2 = byteFromArrayBuffer(buffer, 8);
<>但是我更喜欢一个等价的C++代码:
void main()
{
uint8_t* bytes = loadBytesFromSomewhere();
// Read 4 bytes and make an int
uint32_t integer = intFromBytes(bytes);
// Read 2 bytes and make a short
uint16_t short_integer = shortFromBytes(bytes+4);
delete bytes;
}
我想要这个,因为在解码算法中加入偏移量这一点真的很烦人。同时,我真的希望保持一致并使用ArrayBuffer
,它可以随意转换为任何数据类型的数组
有把戏吗?我试过这个:
//生成20个字节
var buffer=新的UINT8阵列(20);
log(“原始缓冲区:”,buffer.bytellength);
//尝试将缓冲区从cnt偏移
var-shiftedArray=新的Uint8Array(缓冲区,10,10);
var shiftedBuffer=shiftedArray.buffer;
log(“移位缓冲区?长度:”,移位缓冲区.ByTeleLength)代码>
<代码> <代码> > p>下面可能会或可能不完全满足您的需求,我相信这相当于您在C++中所需要的(减去删除字节)。不过,这是一篇老文章,你可能已经有了答案
正如您已经知道的,javascript中的ArrayBuffers
可以通过几个不同的视点/对象(称为TypeDarray)进行访问。这些是诸如Float64Array、Uint32Array等对象。有一个TypedArray对象,允许您在名为DataView
的目标字节偏移量处动态地将数据抓取回您想要的任何类型
因此,要实现所需的功能,您可以执行以下操作:
var buffer = loadByteBufferFromSomewhere();
//DataView would be the same way
var dv = new DataView(buffer);
//uint32 at index 0;
dv.getUint32(0);
//uint16 starting at byte 4
dv.getUint16(4);
//get a target byte at given indexes
dv.getUint8(0);
dv.getUint8(1);
DataView是ArrayBuffer的包装器,如Float64Array、Uint32Array等。您还可以在给定索引处设置目标类型。我在你的JS代码中发现了你想读取多个值,而C++代码中你重新解释了相同的值。我不明白你的问题。不,我没有重新解释相同的值。如果对指针使用+
操作,则将指针移动它所代表的数据类型的条目数量。所以bytes+4
指向了bytes
之外的其他地方。我想对
ArrayBuffer做同样的处理,让它向前指向几个字节,这样解码函数就不必使用第二个参数来抵消它。