2016-02-26 54 views
1

我正在爲node.js編寫C++模塊並遇到以下問題。 代碼:從C++模塊返回緩衝區回到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++函數

相關問題