我正在编写一个程序,使用无连接 (UDP) 套接字与某些病人监护仪进行通信。我需要一个最快和最有效的算法的建议,我应该使用它来解析从病人监护仪接收到的数据。
监护仪以AttributeList结构发送数据,结构定义如下:-
typedef struct {
uint16 count;
uint16 length;
AVAType * values;
} AttributeList;
typdef struct {
uint16 id;
uint16 length;
void * data;
} AVAType
所以一个AttributeList包含很多AVAType结构,每个AVAType结构包含id和data作为void指针(data只是AVAType中实际数据的占位符)。实际上,为AVAType定义了大约150个id,每个ID,数据都必须放在相应的数据结构中进行解析。
因此,如果 AVAType 结构中的 ID 为 1,则必须使用算法 A 解析数据,但如果 ID 为 2,则必须使用算法 B 解析数据,依此类推...
我目前的方法是使用 150 个 if-else 语句并加载 AVAType 的特定数据结构,然后解析结果。此外,患者监护仪按网络字节顺序发送数据,我需要根据 ID 解压 AVAType。
请提出一些处理这种情况的好方法。这只是大学的事,我不太关心安全,我认为安全可以逐渐提高,但现在我担心的是速度。
是的,实际上是 AVAType values[];。您能否更具体地说明为什么这与 AVAType * 不同?如果我以其他方式定义我的结构,它会有什么用处吗?
最佳答案
从整数映射到函数的常用方法只是一个函数指针数组
typedef void (*Fun_ptr)(int id, void *current_byte);
Fun_ptr fun_ptr[0xFFFF+1] = { funcA, funcB, ...};
如果 ids 只有一个字节,我会映射所有 256 个(如果可以限制的话)。
即使所有 16 位 ID,存储空间也不是很大。
我会将未使用的 ID 指向“错误捕获”函数。
使用:
next_buffer_position = fun_ptr[id](id, current_buffer_position);
然后函数知道它被调用的是哪个id,使得error_catch函数很容易写,你只需要一个。
你确定是 AVAType * values;
和 void * data;
吗?
values
或 data
应该是数据包中的偏移量吗?
这并非不可能,而且可能是正确的。目前 AVAType 和 AttributeList 是固定大小的。
字段 AVAType * values;
和 void * data;
是指针的接收计算机大小。这可以是任何东西,但可能是 32 位或 64 位。如果您将软件移动到不同的机器,这是一个潜在的问题,这就是我问的原因。它们不保存数据,它们是指向数据的指针,但它们的大小因接收机器而异。可疑。仔细检查它们的定义大小。
在网络协议(protocol)上处理数据包的一种常见方法是将空数组作为结构中的最后一个字段,例如
typdef struct {
uint16 id;
uint16 length;
unsigned char data[];
} AVAType;
在这种方法中,通常在数据包开始附近的固定位置有一个数据包长度,它给出了数据包剩余部分的实际大小。因此协议(protocol)定义了整个数据包或 data[]
是长度字节。它有点“hackish”,但很容易使用。 (NB IIRC unsigned char data[];
不是合法的 C++)
总结:内存中的结构很可能正是您显示的类型定义,但由于指针的可变大小,在线协议(protocol)有点奇怪。
关于c - C 中的套接字编程和反序列化响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9863905/