我正在尝试使用 node-ffi 包装现有的 C 库,但我似乎无法读取返回的结果。情况有点尴尬,因为函数返回的是 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 所以我认为数据在那里,我只是因为某种原因无法从缓冲区中读取它。
有人知道我缺少什么吗?