-2

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

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

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

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

4

6 回答 6

10

strlen将字符计数到第一个 0 字符,这就是它的用途。

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

于 2012-08-06T11:41:52.040 回答
5

strlen(myarray)返回第一个00in的索引myarray

于 2012-08-06T11:42:38.297 回答
2

你问的是哪种语言?

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

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

于 2012-08-06T12:46:01.460 回答
0

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

于 2012-08-06T11:42:26.877 回答
0

C 风格的字符串由 NULL 终止,并且您的 char* 在第 9 位包含一个 NULL-Byte ,因此 strlen 返回 8,因为它会计算元素直到找到 NULL byte

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

AC 字符串与字符串开头和终止空字符之间的字符数一样长。

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

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

于 2012-08-06T11:44:06.157 回答
0

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

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

'\0'如果你在它的中间,你不能指望它会计算整个字符串。

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

于 2012-08-06T11:46:42.067 回答