strlen() 给出了数组中空字节的错误大小原因
strlen() gives wrong size cause of null bytes in array
我有一个从流中反序列化的动态字符数组。
文件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::string
或 std::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 数组。
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 程序错误地读取了二进制文件的一个字节
- 蓝牙LE:设置字节数组的特征会发送错误的值
- OPENCV错误:不良的参数(字节必须为16、32或64)在简介Descriptorextractorimpl中
- UWP和SerialSample字节编码错误
- ATMega328P 和 ESP8266ex 之间的 I2c 通信只能发送 8 个字节,错误?
- 错误:数组的总大小不得超过0x7fffffff字节
- C++结构到字节*引发错误
- Valgrind 错误:系统调用参数 epoll_pwait(sigmask) 指向不可寻址的字节
- 函数返回的 gsl::span 具有错误的字节
- 使用 libsodium 为 iOS 构建 zeromq,随机字节错误
- strlen() 给出了数组中空字节的错误大小原因
- 比较两个文件的第二个字节时出现分段错误
- 为什么我在使用libusb与PIC 18F2550通信时读取或写入超过3个字节时会出现错误
- C++字符串到字节错误
- setw() 在包含 UTF-8 多字节字符/码位的字符串上输入错误的输出
- 通过取消引用指向字节数组的指针来分配值是错误的吗?
- 字节金币每次都回答错误
- GCC 错误,同时对常量无符号长字节使用代码块
- read()返回在某些系统上读取的错误字节数