javascript V8 ArrayBuffer从int数组?

5lwkijsr  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(109)

我见过Copy data into v8::ArrayBuffer,它能够基于以下数据创建数组缓冲区:

QByteArray data_buffer(file.readAll().data(), file.size());
v8::Handle<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(args.GetIsolate(), data_buffer.size());
memcpy(ab->GetContents().Data(), data_buffer.data(), data_buffer.size());

字符串
但他没有解释如何在::New构造函数中实现这一点。事实上,他提到:
如果我使用文档中的构造函数,在文档中传递一个指向数据的指针,我将不得不自己处理内存,我不希望这样。
正如[documentation][1]所说:
◆新增()[2/2]

static Local<ArrayBuffer> New (   Isolate *   isolate,
void *    data,
size_t    byte_length 
)


static在现有内存块上创建一个新的ArrayBuffer。创建的数组缓冲区立即处于外部化状态。当创建的ArrayBuffer被垃圾回收时,内存块将不会被回收。
基本上它需要一个void* 来自动生成新数据。
我有点困惑如何对一个简单的int数组做到这一点,以下返回一个具有不可预测结果的arraybuffer:
C++代码:

#include <node.h>
using namespace v8;

void Buf(const FunctionCallbackInfo<Value>& a) {
    
    Isolate* i = a.GetIsolate();
    int x[] = {6,9,8,7};
    
    void* temp = x;
    
    Local<
        ArrayBuffer
    > 
    v = 
    ArrayBuffer::New(i, temp, 5);
    a.GetReturnValue().Set(v);

}

void Initialize(Local<Object> exports) {
  NODE_SET_METHOD(exports, "buf", Buf);
}

NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)


然后是我的NodeJS文件:

let a = require("./addon"),
    ab = a.buf(),
    ar = new Uint8Array(ab)
console.log(
    ar, ab
);


但是,当多次运行时,输出会给出非常不可预测的结果,这些结果似乎与原始数组中的值不匹配:

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 122, 64, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b 7a 40
01>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 88, 64, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b 58 40 0
1>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 2, 64, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b 02 40 01
>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 216, 63, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b d8 3f
01>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 79, 64, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b 4f 40 0
1>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 54, 64, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b 36 40 0
1>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 159, 63, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b 9f 3f
01>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 104, 64, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b 68 40
01>, byteLength: 5 }

C:\Users\Coby\Documents\aa\atzmus\testServer>node oy.js
Uint8Array [ 224, 107, 170, 63, 1 ] ArrayBuffer { [Uint8Contents]: <e0 6b aa 3f
01>, byteLength: 5 }


我认为这与之前提到的“自己处理内存”有关-但我对此了解不够,无法解决它,AKA:

如何在C++中从int数组创建ArrayBuffer,并在NodeJS中读取这些确切的int值?[1]:https://v8docs.nodesource.com/node-0.12/d5/d6e/classv8_1_1_array_buffer.html

eqqqjvef

eqqqjvef1#

它在文档中告诉你:
第一个月
如果内存中有一个现有数组,并且您负责管理该数组,则使用的构造函数非常有用。ArrayBuffer不会复制它,也不会在不再需要它时释放它。
但是,你从堆栈传递一个数组到这个构造函数:
int x[] = {6,9,8,7};
这是暂时的。当函数返回时,它将被释放,并将很快被随后的函数调用覆盖。(从技术上讲,这是未定义的行为,它是。但在实践中,您最终会覆盖内存)
现在,如果你将其更改为静态,在这个例子中,它应该可以工作:
static int x[] = {6,9,8,7};
然后数据进入数据段并永远存在。
如何使用该构造函数取决于真实的数据的来源。它会永远存在吗?是否只有在确定ArrayBuffer不再被使用时才释放它?我想你最好复印一份。

相关问题