gpt4 book ai didi

javascript - 我可以在偏移量处引用 ArrayBuffer 吗?

转载 作者:行者123 更新时间:2023-12-02 15:31:23 27 4
gpt4 key购买 nike

我将数据从 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}

但是,当然,可能存在不同类型的序列,例如 2 个无限制的 double 和 4 个 uint32_t。所以我想做这样的事情(但没有 .offset 方法):

var num1 = numberFromArrayBuffer(buffer);
// Shift by 8 bytes - if only `offset(8)` was defined
var num2 = byteFromArrayBuffer(buffer.offset(8));

当然,我可以创建一个“重载函数”:

function numberToArrayBuffer(number, offset) {
return new Float64Array([number], offset||0).buffer;
}

并像这样使用它:

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,它可以随意转为任何数据类型数组。

有什么窍门吗?我试过这个:

//Make 20 bytes
var buffer = new Uint8Array(20);
console.log("Original buffer: ",buffer.byteLength);
//Try to offset the buffer off cnt
var shiftedArray = new Uint8Array(buffer, 10, 10);
var shiftedBuffer = shiftedArray.buffer;
console.log("Shifted buffer? Length:",shiftedBuffer.byteLength);
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

它不仅不起作用,而且还表现出使用偏移量创建的类型化数组可能存在的危险和令人困惑的行为 - 它们的长度可能明显小于其 ArrayBuffer 长度。

最佳答案

以下内容可能完全满足您的需求,也可能不完全满足您的需求,我相信它相当于您在 C++ 中所需的内容(减去删除字节)。不过,这是一篇旧帖子,您可能已经有了答案!

正如您所知,JavaScript 中的ArrayBuffers 可以通过一些不同的视点/对象(称为 TypedArrays)进行访问。这些是 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 等。您还可以在给定索引处设置目标类型。我找到了JavaScripture's references really helpful TypedArrays

关于javascript - 我可以在偏移量处引用 ArrayBuffer 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33284190/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com