2016-08-02 2 views
1

node-ffi를 사용하여 기존 C 라이브러리를 래핑하려고하는데 반환 된 결과를 읽지 못하는 것 같습니다. 함수가 C 구조체nodejs에서 데이터를 읽는 방법 길이가 0 인 node-ffi로 만든 버퍼

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; 
} 

그리고 여기에는 자바 스크립트입니다 :

#!/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-> PTR 버퍼가 모두 0x103b02e20 그래서 난 데이터가 있다고 생각 말할

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

공지 사항 , 난 그냥 버퍼 밖으로 어떤 이유로 읽을 수 없습니다.

누구나 내가 놓친 아이디어가 있습니까?

답변

1

ref documentation을 살펴 봐야합니다. 나는 다음과 같은 것들이 효과가있을 것이라고 생각하지만 나는 그것을 테스트하지 않았다.

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

'null'을 제공합니다. –

+0

하지만 'console.log ("dref ="+ ref.readCString (result.ptr)); "는 데이터가 있음을 보여줍니다. readCString은 길이가 0이므로 무시합니다. –