将缓冲区从c ++模块返回到node.js

时间:2016-02-26 15:35:54

标签: c++ node.js buffer node.js-addon

我正在为node.js编写c ++模块,遇到了以下问题。 代码:

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 ++ - 节点机制的理解。但我是这个范围的初学者,所以我需要你的帮助来制作正确的模块。

1 个答案:

答案 0 :(得分:0)

我找到了答案

缓冲区构造函数中的

(char *)&amp; hash是对自动变量的引用,因此它的值在C ++函数之外是udefined