我从事一个使用 libpcap 捕获 IP 数据包的项目。 libpcap 在缓冲区中返回捕获的数据,带有 unsigned char *
指针和缓冲区长度。缓冲区中的数据不是空终止的。
我确实使用库函数处理缓冲区数据,例如C 标准库中的字符串函数。这些函数需要(有符号的)char *
指针,需要在 unsigned char *
和 char *
之间转换数据。
我喜欢将 unsigned char *
缓冲区假设为具有潜在不可打印字符的非空终止(伴随缓冲区长度)的想法,而不是 char *
缓冲区,其中包含可打印的字符串文字。但是,这迫使我为每个字符串函数调用转换 libpcap 缓冲区,这使代码变得难看。
在这种情况下,您的编码风格偏好是什么?
调用字符串函数时保留
unsigned char *
和cast。从 libpcap 接收到 libpcap 缓冲区后立即将其转换为
char *
,并通过上游代码中的变量命名约定区分原始数据和字符串。
最佳答案
如果您知道您处于应该有文本的协议(protocol)级别, 使用第二种方法,只需保留一个 char* 并在需要的地方使用它。没有理由在任何地方都将其转换为 char*。
但是,要非常、非常、非常小心地使用哪些字符串处理函数。你正在从电线上捕获东西,你可能会得到任何东西。也就是说,您必须在任何地方都遵守 pcap 提供的缓冲区的总长度 - 除非您安全地更改和 nul 终止缓冲区,否则不能使用 strlen、strcpy 等函数。 (并且您确实必须进行健全性检查,例如,如果您正在解析 UDP 数据包的长度并且长度为 130 字节,并不意味着您实际上可以安全访问 130 字节)
您还必须验证您正在解析的内容实际上是文本,例如,您不应该假设它是文本,只需打印出一大块有效负载。
关于库之间的 C 字符串转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7699417/