Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以在偏移处参照ArrayBuffer吗?_Javascript_Typed Arrays - Fatal编程技术网

Javascript 我可以在偏移处参照ArrayBuffer吗?

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

我将数据从JavaScript变量转换为
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);
当然,也可能有不同类型的序列,比如2
unrestricteddouble
s和4
uint32\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做同样的处理,让它向前指向几个字节,这样解码函数就不必使用第二个参数来抵消它。