Я видел Скопируйте данные в 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. На самом деле он упоминает:
Если я использую конструктор из документации, в которой я передаю указатель на данные, мне придется работать с памятью самостоятельно, и я этого не хочу.
Как указано в документации :
◆ New () [2/2]
static Local<ArrayBuffer> New ( Isolate * isolate,
void * data,
size_t byte_length
)
stati c Создайте новый ArrayBuffer поверх существующего блока памяти. Созданный буфер массива сразу же находится во внешнем состоянии. Блок памяти не будет возвращен, когда созданный ArrayBuffer будет собирать мусор.
Что в основном требуется void * для автоматического создания новых данных.
Я был немного смущен как сделать это для простого массива int, следующее возвращает массив буферов с непредсказуемыми результатами:
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:
Как мне создать ArrayBuffer в C ++ из массива int, и прочитать эти точные значения int обратно в NodeJS?