如何从nodejs读取数据,由长度为0的node-ffi创build

我试图包装一个现有的C库使用node-ffi,但我似乎无法读取返回的结果。 情况有点尴尬,因为函数返回C结构

typedef struct { int size; void *ptr; } datum; 

并且代表datum.ptr的节点缓冲区的长度字段是0。

这是显示问题的整个C代码。

 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { void *ptr; int size; } datum; datum get() { int r = 23; datum *p = malloc(sizeof(*p)); if(!p) { printf("malloc failed\n"); exit(1); } p->ptr = malloc(sizeof(r)); if(!p->ptr) { printf("malloc failed\n"); exit(1); } p->size = sizeof(r); memcpy(p->ptr, &r, sizeof(r)); printf("p->size = %d\n", p->size); printf("p->ptr = %p\n", p->ptr); return *p; } 

这里的JavaScript:

 #!/opt/local/bin/node var ref = require("ref"); var ffi = require("ffi"); var util = require("util"); var Struct = require('ref-struct'); var datum = Struct({ 'ptr': 'pointer', 'size': 'int' }); var wrapper = ffi.Library('test.dylib', { "get": [ datum, [ ] ] , }); let result = wrapper.get(); console.log(result); console.log(result.ptr); console.log("result.ptr.length = " + result.ptr.length); console.log(result.ptr.readIntLE(0, 4, true)); console.log(result.ptr.readIntBE(0, 4, true)); console.log(result.ptr.readUInt8(0, true)); console.log(result.ptr.readUInt8(1, true)); console.log(result.ptr.readUInt8(2, true)); console.log(result.ptr.readUInt8(3, true)); 

这里是输出:

 p->size = 4 p->ptr = 0x103b02e20 { ptr: <Buffer@0x103b02e20 >, size: 4, 'ref.buffer': <Buffer@0x1030549e8 20 2e b0 03 01 00 00 00 04 00 00 00 00 00 00 00> } <Buffer@0x103b02e20 > result.ptr.length = 0 NaN NaN undefined undefined undefined undefined 

请注意,p-> ptr和缓冲区均表示0x103b02e20,所以我认为数据在那里,出于某种原因,我无法将它读出缓冲区。

任何人有什么想法我失踪?

你应该看看ref文档 。 我认为以下可能工作,但我没有testing它。

 result.ptr.type = ref.types.int; var value = result.ptr.deref(); //r is an integer (should be 23 in your example) console.log(value);