V8 ArrayBuffer из массива int? - PullRequest
       18

V8 ArrayBuffer из массива int?

0 голосов
/ 14 апреля 2020

Я видел Скопируйте данные в 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?

...