Shi*_*vam 0 c sockets algorithm endianness
我正在编写一个程序,使用无连接(UDP)套接字与某些患者监视器进行通信.我需要一个建议,我应该使用最快,最有效的算法来解析从病人监护仪接收的数据.
病人监护仪将数据作为AttributeList结构发送,结构的定义如下: -
typedef struct {
uint16 count;
uint16 length;
AVAType * values;
} AttributeList;
typdef struct {
uint16 id;
uint16 length;
void * data;
} AVAType
Run Code Online (Sandbox Code Playgroud)
因此,AttributeList包含许多AVAType结构,并且每个AVAType结构都包含id和数据作为void指针(数据只是AVAType中实际数据的占位符).事实上,为AVAType和每个ID定义了大约150个ID,数据必须放在一些相应的数据结构中以便进行解析.
因此,如果AVAType结构中的ID为1,则必须使用算法A解析数据,但如果ID为2则必须使用算法B解析数据,依此类推......
我目前的方法是使用150个if-else语句并加载AVAType的特定数据结构,然后解析结果.患者监护仪也按网络顺序发送数据,我需要根据ID解压缩AVAType.
请提出一些处理这种情况的好方法.这只是一个大学的事情,我不是很安全的兄弟,我认为安全可以逐步改善,但现在我对速度的关注.
是的,它是actaully AVAType值[];.您能否更具体地说明为何与AVAType*不同?如果我以其他方式定义我的结构,它会有用吗?
从整数映射到函数的常用方法只是函数指针数组
typedef void (*Fun_ptr)(int id, void *current_byte);
Fun_ptr fun_ptr[0xFFFF+1] = { funcA, funcB, ...};
Run Code Online (Sandbox Code Playgroud)
如果id只有一个字节,我会映射所有256个(如果它可以被限制).
即使使用所有16位ID,也不是很多存储.
我将未使用的id指向'错误捕获'功能.
使用:
next_buffer_position = fun_ptr[id](id, current_buffer_position);
Run Code Online (Sandbox Code Playgroud)
然后函数知道它被调用了哪个id,使得error_catch函数易于编写,你只需要一个.
你确定它是AVAType * values;和void * data;?
是values或data应该是数据包中的偏移量?
这不是不可能的,也可能是正确的.目前,AVAType和AttributeList是固定大小的.
字段AVAType * values;和void * data;指针的接收计算机大小.这可能是任何东西,但可能是32位,或64位.如果将软件移动到不同的机器上,这是一个潜在的问题,这就是我要问的原因.它们没有数据,它们是数据的指针,但它们的大小取决于接收机器.Suspicous.仔细检查它们的大小.
在网络协议上处理分组的常见方式是将空数组作为结构中的最后一个字段,例如
typdef struct {
uint16 id;
uint16 length;
unsigned char data[];
} AVAType;
Run Code Online (Sandbox Code Playgroud)
在该方法中,通常在分组开始附近的固定位置具有分组长度,并且该分组长度给出分组的其余部分的实际大小.因此协议定义整个数据包还是data[]长度字节.它有点'hackish'但它易于使用.(NB IIRC unsigned char data[];不是合法的C++)
简介:内存中的结构很可能就是你所显示的typedef,但是由于指针的可变大小,线上协议有点奇怪.