【问题标题】:strlen() gives wrong size cause of null bytes in arraystrlen() 给出了数组中空字节的错误大小原因
【发布时间】:2012-08-06 11:39:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能展示反序列化流中数据的代码吗?
  • strlen 返回一个字符串的大小,但是你的myarray 没有一个字符串,所以strlen 在这里没用。
  • 我知道尺寸。在一个函数中,我将“myarray”复制到了一个引用参数“char *copymyarray”。但是“copymyarray”有 8_bytes 而不是 12_bytes。
  • 你是如何复制的? strcpy 也在第一个 0 字节处停止。这在这里是不够的。 memcpy 复制您告诉它要复制的字节数。如何确定copymyarray 的大小?如果您使用的是sizeof,它将告诉您char* 的大小,无论分配了多少或内容是什么。

标签: c++ c deserialization strlen arrays


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您问的是哪种语言?

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          C 风格的字符串以 NULL 结尾,并且您的 char* 在第 9 位包含一个 NULL 字节,因此 strlen 在计算元素时返回 8 直到找到一个 NULL 字节 .

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

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

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

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

          【讨论】:

            【解决方案6】:

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-01-22
              • 2013-03-27
              • 1970-01-01
              • 2020-12-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多