我正在编写一个程序,使用无连接(UDP)套接字与某个病人监护仪通信我需要一个最快和最有效的算法的建议,我应该用来分析从病人监视器接收到的数据。
患者监护仪以属性列表结构发送数据,结构的定义如下:

typedef struct {
  uint16 count;
  uint16 length;
  AVAType * values;
} AttributeList;

typdef struct {
  uint16 id;
  uint16 length;
  void * data;
} AVAType

因此AttributeList包含许多AVAType结构,每个AVAType结构都包含id和作为void指针的数据(数据只是AVAType中实际数据的占位符)事实上,为AVAType定义了大约150个ID,每个ID都必须将数据放在相应的数据结构中进行解析。
所以如果avatype结构中的id是1,那么必须使用算法a解析数据,但是如果id是2,那么必须使用算法b解析数据,依此类推……
我目前的方法是使用150个if-else语句,加载AVAType的特定数据结构,然后解析结果同时,病人监视器按顺序发送网络数据,我需要根据id解包avatype。
请提出一些处理这种情况的好办法这只是一个大学的事情,我不太关心安全,我认为安全可以逐步改善,但现在我关心的是速度。
是的,它实际上是avatype值[];。你能更具体地说明为什么这与AVAType*不同吗如果我用另一种方式来定义我的结构,它会有用吗?

最佳答案

从整数映射到函数的通常方法只是一个函数指针数组

typedef void (*Fun_ptr)(int id, void *current_byte);

Fun_ptr fun_ptr[0xFFFF+1] = { funcA, funcB, ...};

如果i d只有一个字节,我将映射所有256(如果可以限制的话)。
即使有所有16位的id,它也没有太多的存储空间。
我会把未使用的I d指向一个'error catch'函数。
使用:
next_buffer_position = fun_ptr[id](id, current_buffer_position);

然后,函数知道它被调用了哪个id,从而使错误捕获函数易于编写,您只需要一个。
你确定是AVAType * values;void * data;
valuesdata应该是包内的偏移量吗?
这不是不可能的,而且可能是正确的。目前AVAType和AttributeList是固定大小的。
字段AVAType * values;void * data;是指针的接收计算机大小这可能是任何东西,但可能是32位,或64位。如果你把软件移到不同的机器上,这是一个潜在的问题,这也是我问的原因。它们不保存数据,它们是指向数据的指针,但它们的大小因接收机器而异可疑的仔细检查它们的尺寸。
在网络协议上处理数据包的一种常见方法是将空数组作为结构中的最后一个字段,例如。
typdef struct {
  uint16 id;
  uint16 length;
  unsigned char data[];
} AVAType;

在这种方法中,通常在数据包开始处附近的固定位置有一个数据包长度,它给出了数据包剩余部分的实际大小。所以协议定义了整个包还是data[]是长度字节它有点“老套”,但很容易使用(NB Ircunsigned char data[];不是合法C++)
摘要:内存中的结构很可能正是您所显示的typedef,但是联机协议有点奇怪,因为指针的大小可变。

10-04 13:28