库之间的 C 字符串转换

标签 c string pointers coding-style casting

我从事一个使用 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/

相关文章:

c - 确保只将指针传递给可变参数函数

c - 程序打印我想要的结果,除了在一个地方我得到的是内存地址而不是地址的值。

android - 使用 Bazel 为 Android 编译 OpenSSL

c - 无法写入共享内存段

c - 从文件中读取数组,直到遇到 0

java - 实习字符串在不同线程和类加载器之间的行为如何?

无法分析 gperftools 分析器的输出(配置文件)

java - Java 中 String 的 StringBuilder

c - 将字符串添加到字符数组的特定位置,导致 C 编程中的缓冲区溢出

c++ - 如何合并两个包含 std::unique_ptr 的 vector ?