为什么 char 数组在检测到 0x00 字节之前就停止,如何避免这个问题(也许通过使用另一种数据类型(哪种数据类型以及为什么)或使用 char 的“技巧”)?
例如在下面的代码中,输出的只是“a”,其他字节不显示:
unsigned char cbuffer[]={0x61,0x00,0x62,0x63,0x0};
std::string sbuffer=reinterpret_cast<const char*>(cbuffer);
cout << sbuffer << endl;
类似下面的代码,输出的是“ab”:
unsigned char cbuffer[]={0x61,0x62,0x00,0x63,0x0};
std::string sbuffer=reinterpret_cast<const char*>(cbuffer);
对于该问题(其中 0x00 作为普通字节保存在数组中)的直接有效的解决方法将不胜感激。
最佳答案
在 C 语言中,将字符串作为指向空终止 char
数组的指针进行传递是很常见的。 null 由 0x00
表示。为了简化转换,std::string
可从指向空终止字符数组的指针构造,这就是您的代码所发生的情况。但是当它找到 null 时,它认为这是字符串的结尾。如果你直接 cout
一个 char 数组,你会发现它做了同样的假设,因为它们没有其他方法来确定 char*
指向的字符串的结尾>。 (如果他们理解 char (&)[]
,理论上他们可以说出你的情况的长度,但遗憾的是标准库中几乎没有任何东西可以做到)。
预期的解决方法是改用此构造函数:
int len = sizeof(cbuffer)/sizeof(cbuffer[0]);
std::string sbuffer(cbuffer, len); //5 characters in cbuffer, 1 byte each
或
int len = sizeof(cbuffer)/sizeof(cbuffer[0]);
std::cout.write(cbuffer, len); //5 characters in buffer, 1 byte each
但是,您必须小心使用sizeof(cbuffer)
。如果 cbuffer
是 char*
(指针)而不是 char(&)[]
(数组),则 sizeof(ptr )
将返回错误的值,并且如果字符串不是以 null 结尾的,则此时无法获得正确的长度。
关于c++ - 0x00 和 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510239/