1

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

实例 1

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

#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但我很难将字符串存储在cPhoneNumbercNamecCallIdcPreviousCallId. 这是我使用它进行设置的方式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
  • 有没有办法在ref-array这里使用?

实例 2

我有一个struct这样定义的C:

typedef struct AUDIO_OS_DEVICES {
    int nNumberDevices;
    AUDIO_OS_DEVICE *pDevices;
} AUDIO_OS_DEVICES;

在这段代码中,*pDevices最终成为一个AUDIO_OS_DEVICE结构数组。这些结构在 C 中定义为:

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;

在 Javascript 我有这个设置使用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要在这里转换什么类型,也不知道如何提取AUDIO_OS_DEVICE结构数组。我遇到了已经用字符数组描述的问题。

任何帮助,将不胜感激。在我弄清楚这一点之前,我处于死胡同。

4

0 回答 0