【问题标题】:Convert unsigned char* to QString and vice versa将 unsigned char* 转换为 QString,反之亦然
【发布时间】:2021-01-01 06:05:41
【问题描述】:

我正在尝试将const unsigned char* 转换为QString,反之亦然。我设法将其转换为一个方向,但不是从QString 转换为const unsigned char*。我见过很多类似的问题,但没有一个解决方案适合我。

这是我的示例代码:

void f(const unsigned char* addr)
{
 QString data = QString::fromLatin1((const char*)addr, len);  //should work correctly
 
 unsigned char* cc = new unsigned char[data.size()];
 memcpy(cc, data.toStdString().c_str(), data.size());   //isn't working
}

我检查解决方案:在本例中为len = 8,因此:

data 包含:

unsigned char buff[8];
for (int i = 0; i < 8; i++)
    buff[i] = cc[i];
//buff now contains [194,128,6,0,1,0,0,18]

unsigned char bb[8];
memcpy(bb, addr, 8);
//bb contains [128,6,0,1,0,0,18,0]

还有其他方法吗?感谢您的任何意见。

【问题讨论】:

  • 对我来说看起来不错,是什么让你说它不起作用?
  • @john 不确定,但我认为这也不能解释空终止符。我宁愿建议strcpy
  • 在您发布的代码中,无法知道它是否“有效”。也许您使用了调试器,这很好,但您需要告诉我们是什么让您得出结论认为它“不起作用”
  • 了解什么是工作也会有所帮助,尤其是关于 nul 终止符,您可能想复制也可能不想复制。
  • 我认为你需要添加一个minimal reproducible example 可能不考虑空终止符是问题。

标签: c++ windows qt qstring


【解决方案1】:

所以这里有一个关于真正发生的事情的线索。在您的原始字符串中,您有字节序列 194 128。这可能是 UTF-8 中欧元符号的编码。在您的输出中已被单字节 128 替换,这是 Windows-1252 代码页中欧元符号的编码。

因此,在您的代码中某处发生了编码变化,这就解释了为什么您会看到输入和输出的差异。几乎可以肯定,由于您正在使用一个或其他 QString 函数,正在发生这种变化。

如果不了解您实际在做什么,就不可能真正解决这个问题。如果您的字节数组不代表文本,那么将它们放入 QString 是错误的,因为它们用于 Unicode 文本而不是任意字节数组。

【讨论】:

  • QString 将字符存储为 16 位不确定这是否是问题的原因。相关:https://doc.qt.io/qt-5/qstring.html#details 也许 QByteArray 是更好的选择,但我不明白首先转换为 QString 的原因。
  • 我的字节数组addr确实不代表文本。我正在读取一个.pcap 文件,因此addr 代表数据流。如果不是QString,我应该使用什么?
  • 试试QByteArray 除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位'\0'结尾的字符串。对于大多数用途,QString 是您要使用的类。它在整个 Qt API 中使用,并且 Unicode 支持确保如果您想在某个时候扩展应用程序的市场,您的应用程序将易于翻译。适合使用 QByteArray 的两种主要情况是,当您需要存储原始二进制数据时,以及当内存保护至关重要时(例如在嵌入式系统中)。
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 2020-03-01
  • 1970-01-01
  • 2014-01-23
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多