【问题标题】:Data loss in converting char array to string将char数组转换为字符串时的数据丢失
【发布时间】:2018-06-27 09:00:27
【问题描述】:

我使用两种不同的方式将char array 转换为string,但它们都返回4 作为字符串的length,而字符大小为16:

char chr[16] = { 0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,0x21,0xB8,0x01,0x4C,0xCD,0x21,0x57,0x69 };

const string str(chr); // First try
string str2 = static_cast<string>(chr); // Second try

cout << sizeof chr << endl; // size of the char
cout << "Converted: " << str << " Size: " << str.length() << endl; // length of converted char
cout << "Converted: " << str2 << " Size: " << str2.length() << endl; // length of converted char

这种数据丢失的原因是什么?解决方法是什么?

【问题讨论】:

  • 如果您想要一个字符数组而不是一段文本,请考虑std::vector&lt;char&gt;std::vector&lt;std::int8_t&gt;std::vector&lt;std::uint8_t&gt; 可能更好。

标签: c++ casting type-conversion


【解决方案1】:

\0 被视为终止字符串 并在

char chr[16] = { 0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,0x21,0xB8,0x01,0x4C,0xCD,0x21,0x57,0x69 };

你的第五个字符是\0

所以字符串仅由前 4 个字符构成。

您可以使用可以指定大小的字符串中的构造函数来修复它。 将const string str(chr); 替换为const string str(chr, 16);

还有0xB40xCD0xB8 不适合字符,因为它们都高于 128

【讨论】:

  • 不错的发现,我当时正茫然地看着这个,感觉像个白痴
  • 我应该对这些字符使用 unsigned char 吗?
  • @AidenStewart unsigned char 中的数字适合,但 std::string 期望 char
  • 因为你有一个真正的数组,你可以用 sizeof(chr) 替换幻数 16。如果您以后更改大小,则必须在一个地方进行更改...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2019-08-04
  • 2013-04-25
  • 2012-11-04
相关资源
最近更新 更多