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