我想知道是否有任何已知的最佳实践/方法来解析混合类型的数据包。
例如,假设数据是 10 个字节,它包括:
字节0-1:制造商ID(整数)
字节 2:类型 (int)
字节 3-4:设备 ID(ascii 字符)
我可以简单地将每个数据类型的大小和位置定义为#define,并使用这些定义对其进行解析。但我想知道是否有任何结构可以更好地组织它。
最佳答案
最佳实践是假定所有来自程序外部的数据(例如来自用户、文件、网络、不同进程的数据)可能不正确(并且可能不安全/恶意)。
然后,基于“潜在不正确”的假设定义类型以区分“未检查的、潜在的错误数据”和“检查的、已知正确的数据”。对于您的示例,您可以使用 uint8_t packet[10];
作为未检查数据和正常结构的数据类型(带填充且不带 __attribute__((packed));
) 用于检查的数据。这使得程序员在认为他们使用的是安全/经过检查的数据时,很难意外使用不安全的数据。
当然,您还需要代码在这些数据类型之间进行转换,这需要尽可能多地进行健全性检查(并且可能还需要担心诸如字节序之类的事情)。对于您的示例,这些检查可能是:
- 是任何应该是 ASCII 字符的字节 >= 0x80,并且它们中的任何一个都是无效的(例如,可能不允许像退格键这样的控制字符)。
- 制造商 ID 是否有效(例如,可能有一个需要匹配的枚举)
- 类型是否有效(例如,可能有一个需要匹配的枚举)
请注意,此函数应返回某种状态以指示转换是否成功,并且在大多数情况下,此状态还应指示转换不成功时出现的问题(以便调用者可以通知用户或记录问题或以最适合问题的方式处理问题)。例如,“未知的制造商 ID”可能意味着需要更新程序以处理新的制造商并且数据是正确的,而“无效的制造商 ID”意味着数据肯定是错误的。
关于c - 解析混合类型数据的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53236024/