将 node.js 缓冲区转换为引用结构实例
Converting node.js buffer into a ref-struct instance
我正在用 C 和 Javascript(在 node.js)编写程序,使用 ffi, ref 和其他一些参考包。
我有以下代码,我将其编译成一个库 libfun.so:
fun.c
#include "fun.h"
#include <stdio.h>
#include <stdlib.h>
void fill_array(void **data_array, int length)
{
int i;
for (i = 0; i < length; i++) {
data_array[i] = malloc(sizeof(data));
((data *)data_array[i])->id = 256;
((data *)data_array[i])->message = 512;
}
}
void print_array(void **data_array, int length)
{
int i = 0;
for (i = 0; i < length; i++) {
printf("(%d, %d)\n", ((data *)data_array[i])->id,
((data *)data_array[i])->message);
}
}
fun.h
#ifndef fun_h__
#define fun_h__
typedef struct {
int id;
int message;
} data;
void fill_array(void **,int);
void print_array(void **,int);
#endif
fun.js
var ffi = require('ffi');
var Struct = require('ref-struct');
var ref = require('ref');
var ArrayType = require('ref-array');
// js analog of the data struct from fun.h
var Data = Struct({
id: ref.types.int,
message: ref.types.int,
});
// js analog of the type data *
var DataPointer = ref.refType(Data);
// pvoid is the js analog of void * in C
var pvoid = ref.refType(ref.types.void);
var PVoidArray = ArrayType(pvoid);
// set up our foreign functions from libfun
var libfun = ffi.Library('./libfun', {
'fill_array' : ['void', [PVoidArray,ref.types.int]],
'print_array' : ['void', [PVoidArray, ref.types.int]]
});
var myArray = new PVoidArray(10);
libfun.fill_array(myArray,10);
libfun.print_array(myArray,10); // this prints the array of structs correctly, from the C side
我的问题是:如何从 Javascript 面 打印结构数组 ? 我想将 myArray 作为 PVoidArray
传递。 我不想创建结构数组(即创建 var DataArray = ArrayType(DataPointer)
,并使用它代替 PVoidArray
无处不在)。
让我们从 myArray[0] 开始。我们可以使用我们的变量 Data
来(以灵活的方式)获取 myArray[0]
并创建一个结构吗?像一些函数 bufferToArray(myArray[0],Data) == a Data instance containing the data of myArray[0]
。
查看 ref.get()
的文档,您可以使用它:
ref.get(myArray.buffer, index, DataPointer).deref()
将 return 来自 myArray
的 index
的 Data
实例。
我正在用 C 和 Javascript(在 node.js)编写程序,使用 ffi, ref 和其他一些参考包。
我有以下代码,我将其编译成一个库 libfun.so:
fun.c
#include "fun.h"
#include <stdio.h>
#include <stdlib.h>
void fill_array(void **data_array, int length)
{
int i;
for (i = 0; i < length; i++) {
data_array[i] = malloc(sizeof(data));
((data *)data_array[i])->id = 256;
((data *)data_array[i])->message = 512;
}
}
void print_array(void **data_array, int length)
{
int i = 0;
for (i = 0; i < length; i++) {
printf("(%d, %d)\n", ((data *)data_array[i])->id,
((data *)data_array[i])->message);
}
}
fun.h
#ifndef fun_h__
#define fun_h__
typedef struct {
int id;
int message;
} data;
void fill_array(void **,int);
void print_array(void **,int);
#endif
fun.js
var ffi = require('ffi');
var Struct = require('ref-struct');
var ref = require('ref');
var ArrayType = require('ref-array');
// js analog of the data struct from fun.h
var Data = Struct({
id: ref.types.int,
message: ref.types.int,
});
// js analog of the type data *
var DataPointer = ref.refType(Data);
// pvoid is the js analog of void * in C
var pvoid = ref.refType(ref.types.void);
var PVoidArray = ArrayType(pvoid);
// set up our foreign functions from libfun
var libfun = ffi.Library('./libfun', {
'fill_array' : ['void', [PVoidArray,ref.types.int]],
'print_array' : ['void', [PVoidArray, ref.types.int]]
});
var myArray = new PVoidArray(10);
libfun.fill_array(myArray,10);
libfun.print_array(myArray,10); // this prints the array of structs correctly, from the C side
我的问题是:如何从 Javascript 面 打印结构数组 ? 我想将 myArray 作为 PVoidArray
传递。 我不想创建结构数组(即创建 var DataArray = ArrayType(DataPointer)
,并使用它代替 PVoidArray
无处不在)。
让我们从 myArray[0] 开始。我们可以使用我们的变量 Data
来(以灵活的方式)获取 myArray[0]
并创建一个结构吗?像一些函数 bufferToArray(myArray[0],Data) == a Data instance containing the data of myArray[0]
。
查看 ref.get()
的文档,您可以使用它:
ref.get(myArray.buffer, index, DataPointer).deref()
将 return 来自 myArray
的 index
的 Data
实例。