如何使用复杂的数据结构与`ffi`,`ref-struct`和`ref-array`?

时间:2016-12-07 16:33:01

标签: node.js node-ffi ref-struct

我正在开发一个使用ffi与已编译的C库进行交互的项目。我试图让一些复杂的数据结构起作用,并且在找出在这些数据结构中获取值的正确方法时遇到了问题。我有两个实例我想弄清楚。我不是一个C家伙,所以我就是为了这个目标。

实例1

有一个C struct包含属性,它们看起来像指向字符数组的指针。这是定义struct

的C代码
#define RPC_STRING_LENGTH           32
#define RPC_STRING_LENGTH_CALLID    128
typedef struct {
    E_CALL_STATE eCallState;
    BOOL bInboundCall;
    BOOL bVideoCall;
    BOOL bRecording;
    BOOL bEncrypted;
    BOOL bHDAudio;
    BOOL bVirtualMeetingCall;
    E_PROTOCOL_CODEC eCurrentCodec;
    E_PROTOCOL_ALERT_INFO_CALL_TYPE eAlertInfoType;
    double dAccumulatedMOSLQ;
    int  nVideoState;
    int  nErrorCode;
    unsigned int nCallStartTime;
    char cPhoneNumber[RPC_STRING_LENGTH];
    char cName[RPC_STRING_LENGTH];
    char cCallId[RPC_STRING_LENGTH_CALLID];
    char cPreviousCallId[RPC_STRING_LENGTH_CALLID];
} RPC_CALL_STATE;

现在,我已经能够成功提取E_CALL_STATE BOOL属性,但我很难在{{1}中获取字符串存储},cPhoneNumbercNamecCallId。以下是我使用cPreviousCallId进行设置的方法:

ref-struct

以下是解释此import ref from 'ref'; import StructType from 'ref-struct'; const RPC_CALL_STATE = StructType({ eCallState: ref.types.int, bInboundCall: ref.types.bool, bVideoCall: ref.types.bool, bRecording: ref.types.bool, bEncrypted: ref.types.bool, bHDAudio: ref.types.bool, bVirtualMeetingCall: ref.types.bool, dAccumulatedMOSLQ: ref.types.double, nVideoState: ref.types.int, nErrorCode: ref.types.int, nCallStartTime: ref.types.uint, cPhoneNumber: ref.types.char, cName: ref.types.char, cCallId: ref.types.char, cPreviousCallId: ref.types.char, }); 的Javascript(供参考,struct是外部定义的RPC_CALL_STATE):

enum

如果我查看pDataRef = ref.reinterpret(pData, RPC_CALL_STATE.size); pDataRef.type = RPC_CALL_STATE; const callProgressStruct = ref.get(pDataRef); 上存储的值,我会得到callProgressStruct.cPhoneNumber。所以,有几个问题:

  • 这里使用的0是什么?
    • ref.types是否正确?
    • 如果没有,那
  • 如何提取存储在char
  • 中的实际字符串值
  • 有没有办法在这里使用cPhoneNumber

实例2

我有一个C ref-array定义如下:

struct

在此代码中,typedef struct AUDIO_OS_DEVICES { int nNumberDevices; AUDIO_OS_DEVICE *pDevices; } AUDIO_OS_DEVICES; 最终成为*pDevices结构的数组。这些结构在C中定义为:

AUDIO_OS_DEVICE

在Javascript中,我使用typedef struct AUDIO_OS_DEVICE { int deviceId; int deviceFlags; char deviceName[AUDIO_OS_DEVICE_NAME_MAX_LEN]; char deviceUID[AUDIO_OS_DEVICE_UID_MAX_LEN]; char manufacturerName[AUDIO_OS_DEVICE_MANUFACTURER_MAX_LEN]; } AUDIO_OS_DEVICE; 进行了此设置:

ref-struct

不知道const AUDIO_OS_DEVICE = StructType({ deviceId: ref.types.int, deviceFlags: ref.types.int, deviceName: ref.types.char, deviceUID: ref.types.char, manufacturerName: ref.types.char, }); const AUDIO_OS_DEVICES = StructType({ nNumberDevices: ref.types.int, pDevices: [???], }); 转换为的类型,我是否知道如何提取pDevices结构数组。我遇到了已经用字符数组描述过的问题。

任何帮助将不胜感激。我已经走到了尽头,直到我能解决这个问题。

0 个答案:

没有答案