我正在开发一个用于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
但我很难将字符串存储在cPhoneNumber
、cName
、cCallId
和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
? - 有没有办法在
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
结构数组。我也遇到了已经用字符数组描述的问题。
任何帮助,将不胜感激。在我弄清楚这一点之前,我处于死胡同。