我有一个从流中反序列化的动态 char 数组。
文件内容char *myarray
(使用十六进制编辑器):
4F 4B 20 31 32 20 0D 0A 00 00 B4 7F
strlen(myarray)
返回 8,(必须为 12)
我有一个从流中反序列化的动态 char 数组。
文件内容char *myarray
(使用十六进制编辑器):
4F 4B 20 31 32 20 0D 0A 00 00 B4 7F
strlen(myarray)
返回 8,(必须为 12)
strlen
将字符计数到第一个 0 字符,这就是它的用途。
如果你想知道反序列化数组的长度,你必须从其他地方得到,反序列化代码应该知道它反序列化的数组有多大。
strlen(myarray)
返回第一个00
in的索引myarray
。
你问的是哪种语言?
在 C 中,您需要记住大小并将其传递给任何需要知道它的东西。没有(可移植的)方法来确定分配数组的大小,只给它一个指向它的指针,正如你所说,strlen
其他处理零终止字符串的函数不适用于未终止的数据块。
在 C++ 中,使用std::string
或std::vector<char>
来管理动态字节数组。这两个都使大小可用,并为您处理释放。
第 9 个字符是 00。即 '\0'。这就是您得到 8 而不是 12 的原因。
strlen() 将其作为 Null 终止符。
C 风格的字符串由 NULL 终止,并且您的 char* 在第 9 位包含一个 NULL-Byte ,因此 strlen 返回 8,因为它会计算元素直到找到 NULL byte。
(来自http://www.cplusplus.com/reference/clibrary/cstring/strlen/):
AC 字符串与字符串开头和终止空字符之间的字符数一样长。
当您将 char* 用于二进制数据时,您不能使用 strlen 函数,但要记住(传递)char 数组的大小。
在您的情况下,您可以在传输时序列化动态数组的大小,并在分配/读取数组之前对其进行反序列化。
来自 cplusplus.com(http://www.cplusplus.com/reference/clibrary/cstring/strlen/):
C 字符串的长度由终止的空字符确定
'\0'
如果你在它的中间,你不能指望它会计算整个字符串。
在这种情况下,我发现最好将消息的长度与流中的数据一起序列化。例如,您首先序列化 char 数组的长度 - 12,然后序列化实际数据(字符)。这样,当您读取数据时,您将首先读取长度,然后您可以读取那么多字符并确保这是您的 char 数组。