首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从node-ffi创建的长度为0的nodejs缓冲区中读取数据

如何从node-ffi创建的长度为0的nodejs缓冲区中读取数据
EN

Stack Overflow用户
提问于 2016-08-02 22:59:56
回答 1查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
typedef struct {
  int size;
  void *ptr;
} datum;

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

下面是显示该问题的完整C代码。

代码语言:javascript
复制
#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:

代码语言: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));

下面是输出:

代码语言:javascript
复制
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和buffer都显示为0x103b02e20,所以我认为数据就在那里,只是出于某种原因无法从缓冲区中读取它。

有人知道我错过了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2016-08-09 22:57:04

你应该看看ref documentation。我认为下面的方法可能会起作用,但我还没有测试过。

代码语言:javascript
复制
result.ptr.type = ref.types.int;
var value = result.ptr.deref(); //r is an integer (should be 23 in your example)
console.log(value);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38724000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档