gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:33 24 4
gpt4 key购买 nike

我正在为 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 中的最大整数大小,结果是完美的但不正确,因此我们应该使用缓冲区。但是那里还有另一个问题。第一次调用返回不正确和不同的缓冲区。但他们应该是一样的

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

最佳答案

我找到了答案

Buffer构造函数中的(char*)&hash是对自动变量的引用,所以它的值在C++函数外是未定义的

关于c++ - 将缓冲区从 C++ 模块返回到 node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35655765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com