Массив преобразования в node.js с помощью node-gyp

У меня есть исходная библиотека на C++, и я хочу использовать ее в своем приложении Node.js. Чтобы узнать, как это работает, я использую node-gyp для компиляции кода C++, который имеет 2 простые функции для вычисления контрольной суммы (crc16 и crc16Two).

void crc16(const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = args.GetIsolate();

    if (args.Length() < 2) {
        // Throw an Error that is passed back to JavaScript

        isolate->ThrowException(Exception::TypeError(
            String::NewFromUtf8(isolate, "Wrong number of arguments")));
        return;
    }

    uint32_t size = args[1]->Uint32Value();
    Local<Array> *data;
    Local<Array> jsArray = Local<Array>::Cast(args[0]);
    *data = jsArray;

    uint16_t crc = 0xFFFF;
    uint8_t i = 0;

    while (size--)
    {
        crc ^= data++ << 8;

        for (i = 0; i < 8; i++)
            crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
    }

    Local<Number> num = Number::New(isolate, crc);
    args.GetReturnValue().Set(num);
}

void crc16Two(const FunctionCallbackInfo<Value>& args) {
    Isolate* isolate = args.GetIsolate();

    // Check the number of arguments passed.

    if (args.Length() < 2) {
        // Throw an Error that is passed back to JavaScript

        isolate->ThrowException(Exception::TypeError(
            String::NewFromUtf8(isolate, "Wrong number of arguments")));
        return;
    }
    // Check the argument types

    if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
        isolate->ThrowException(Exception::TypeError(
            String::NewFromUtf8(isolate, "Wrong arguments")));
        return;
    }
    // Perform the operation

    uint16_t v1 = args[0]->Uint32Value();
    uint16_t v2 = args[1]->Uint32Value();
    uint16_t crc = 0xFFFF;
    uint8_t i = 0;
    crc ^= v1 << 8;
    for (i = 0; i < 8; i++)
        crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;

    crc ^= v2 << 8;
    for (i = 0; i < 8; i++)
        crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;

    Local<Number> num = Number::New(isolate, crc);
    args.GetReturnValue().Set(num);
}

Crc16Two работает нормально, у меня правильный результат, но при компиляции crc16 с node-gyp rebuild возникают ошибки:

..\Crc.c (49): error C2296: <<: inadmissible, the left operand is "v8::Local <v8 :: Array> *" [C:\Users\dns\Desktop\Crc\build\addon.vcxproj]

Вот привязка.gyp:

{ "targets": [{"target_name": "addon", "sources": [ "crc.cc" ], "include_dirs" : ["<!(node -e \"require('nan')\")"]}]}

И код на Node.js:

var addon = require('bindings')('addon');
var buf = new Buffer([0,1,2,3,4,5,6,7,8,9]);
console.log(addon.crc16(buf,10));
console.log(addon.crc16Two(32145, 1470));

Не могли бы вы рассказать, как это исправить? Я думаю, что я делаю что-то не так.


person japskiddin    schedule 17.10.2016    source источник


Ответы (1)


Меня очень смущает эта строка:

 crc ^= data++ << 8;

данные эффективно:

v8::Local <v8 :: Array> *

Но в документации нет упоминания о ‹‹ реализация оператора на нем. Ошибка оправдана для меня. и сдвиг битов кажется странным, вы действительно уверены, что хотели это сделать?

Кроме того, чуть выше того, что вы делаете:

 Local<Array> *data;
 Local<Array> jsArray = Local<Array>::Cast(args[0]);
 *data = jsArray;

В тот момент, когда вы пишете *data = jsArray , данные представляют собой унифицированный указатель, запись *data приведет к сбою вашей программы.

person Hector Roussille    schedule 17.10.2016
comment
О, я понял. Могу ли я преобразовать jsArray в типичный массив C++ для работы с ним? Или это невозможно. - person japskiddin; 18.10.2016
comment
Я пытаюсь сделать что-то вроде этого: ‹pre›Local‹Array› jsArray = Local‹Array›::Cast(args[0]); uint32_t size = args[1]->Uint32Value(); uint8_t *данные = новый uint8_t[размер]; for (unsigned int i = 0; i ‹ jsArray->Length(); i++) { if (jsArray->Has(i)) { *data = jsArray->Get(i)->Uint32Value(); } }‹/pre› Работает без ошибок, но во время теста каждый раз получаю новый результат с теми же данными. - person japskiddin; 18.10.2016