strlen() 给出了数组中空字节的错误大小原因

strlen() gives wrong size cause of null bytes in array

本文关键字:错误 字节 数组 strlen      更新时间:2023-10-16

我有一个从流中反序列化的动态字符数组。

文件char *myarray的内容(使用十六进制编辑器):

      4F 4B 20 31 32 20 0D 0A 00 00 B4 7F

strlen(myarray)返回 8,(必须为 12)

strlen

字符数到前 0 个字符,这就是它的用途。

如果你想知道反序列化数组的

长度,你必须从其他地方获取它,反序列化代码应该知道它反序列化的数组有多大。

> strlen(myarray) 返回 myarray 中第一个00的索引。

你问的是哪种语言?

在 C 中,您需要记住大小并将其传递给任何需要知道它的人。没有(可移植的)方法来确定分配数组的大小,只要有一个指向它的指针,正如你所说,strlen和其他处理零终止字符串的函数不适用于未终止的数据块。

在C++中,使用 std::stringstd::vector<char> 来管理动态字节数组。这两者都使大小可用,并为您处理释放。

9 个字符是 00,即 '\0'。这就是你得到 8 而不是 12 的原因。
strlen() 将其作为 Null 终止符。

C 样式字符串以 NULL 结尾,并且您的 char* 在第 9 个位置包含一个 NULL-Byte,因此 strlen 返回 8,因为它对元素进行计数,直到找到 NULL 字节

(从 http://www.cplusplus.com/reference/clibrary/cstring/strlen/):

C 字符串的长度与字符串开头和终止 null 字符之间的字符数一样长。

当您将 char* 用于二进制数据时,您不得使用 strlen 函数,但请记住(传递)char 数组的大小。

在您的情况下,您可以在传输时序列化动态数组的大小,并在分配/读取数组之前对其进行反序列化。

from cplusplus.com (http://www.cplusplus.com/reference/clibrary/cstring/strlen/):

C 字符串的长度由终止决定 空字符

如果中间有'',则不能期望它会计算整个字符串。

在这种情况下,我发现最好将消息的长度与流中的数据一起序列化。例如,首先序列化 char 数组的长度 - 12,然后序列化实际数据(字符)。这样,当您读取数据时,您将首先读取长度,然后您可以读取那么多字符并确保这是您的 char 数组。