2016-02-26 2 views
1

Я пишу модуль C++ для node.js и столкнулся с следующей проблемой. Код:Обратный буфер от модуля C++ back to node.js

void wrapMurmurHash64B(const FunctionCallbackInfo<Value>& args) { 
    Isolate* isolate = args.GetIsolate(); 
    std::string s = getDataFromArgs(args); 
    if (!s.size()) { 
    return; 
    } 

    uint32_t seed = args[1]->NumberValue(); 
    uint64_t hash = MurmurHash64B(s.data(), s.size(), seed); 

/* 
    Local<Number> num = Number::New(isolate, hash); 
    args.GetReturnValue().Set(num); 
    return; 
*/ 

    // as Buffer 
    Local<Object> buf; 
    if (node::Buffer::New(isolate, (char*)&hash, sizeof(uint64_t)).ToLocal(&buf)) { 
    args.GetReturnValue().Set(buf); 
    } else { 
    isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Cannot create buffer"))); 
    } 
} 

void init(Local<Object> exports) { 
    // ... 
    NODE_SET_METHOD(exports, "murmurHash64B", wrapMurmurHash64B); 
} 

Если раскомментировать прокомментировал код, чем функция будет возвращать один и тот же результат для каждого вызова

$ node 
> var m = require("./build/Release/murmurhash") 
> m.murmurHash64B("ws2yy") 
11130111584464441000 
> m.murmurHash64B("ws2yy") 
11130111584464441000 
> m.murmurHash64B("ws2yy") 
11130111584464441000 

Результат совершен, но неправильно из-за максимальный размер целого числа в узле так, что мы должны использовать буферы. Но есть и другая проблема. Первые вызовы возвращают неправильные и разные буферы. Но они должны быть такими же

$ node 
> var m = require("./build/Release/murmurhash") 
> m.murmurHash64B("ws2yy") 
<Buffer 00 00 00 00 01 00 00 00> 
> m.murmurHash64B("ws2yy") 
<Buffer bc fc a8 00 00 00 00 00> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 00 00 00 00 00 00 00 00> 
> m.murmurHash64B("ws2yy") 
<Buffer 00 00 00 00 00 00 00 00> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 
> m.murmurHash64B("ws2yy") 
<Buffer 99 90 76 26 84 19 76 9a> 

Я предполагаю, что ошибка в моем понимании C++ - механика к узлу. Но я новичок в этой области, поэтому мне нужна ваша помощь для создания правильного модуля.

ответ

0

Я нашел ответ

(символ *) & хэш в буфере конструктор является referense к автоматической переменной, поэтому его значение udefined вне функции C++

 Смежные вопросы

  • Нет связанных вопросов^_^