【问题标题】:Converting QByteArray to integer将 QByteArray 转换为整数
【发布时间】:2017-03-15 03:40:25
【问题描述】:

我有一个QByteArray 数据,当我用qDebug 打印出来时,它会产生如下内容:

qDebug() << rawData; 
//here is the reult:
MXTP24\\x00\\x00\\xF3\\x8F

现在我需要将 4 个十六进制字符串转换为 32 位整数,即我需要将 \x00 \x00 \xF3 \x8F 解析为整数。我尝试了以下代码,但失败了:

QDataStream ds;
ds << rawData.mid(8,2);
ds << rawData.mid(13,2);
ds << rawData.mid(18,2);
ds << rawData.mid(23,2);

quint32 sampleCounter = 0;
ds >> sampleCounter;
qDebug() << "PARSER => onReceivePacket => sampleCounter => " << sampleCounter;

但无论我多么努力,它都会失败并打印出0。我不知道QByteArray 到底发生了什么。我认为这是一项微不足道的任务,但我无法弄清楚

【问题讨论】:

  • 什么是rawData?数据代表什么?
  • @SeanKuhlman 这只是我从网络套接字中获得的东西......我只知道我需要以某种方式将 4 十六进制字符串转换为整数。我的意思是这是我在问题中显示的 QByteArray
  • rawData.size() 是否等于 10?尝试将ds &lt;&lt; rawData.mid(6, 4); 作为ds 的唯一插入。最后四个字节看起来被编码,因为它们不能作为字符打印。
  • 您确定数据是由另一端的QDataStream 创建的吗?
  • 至少我认为您在 QByteArray 中错误地计算了偏移量——“\\”表示单个反斜杠字符。也就是说,上例中的rawData 有22 个字节而不是26 个。

标签: c++ qt qbytearray


【解决方案1】:

恕我直言,您不应该以这种方式手动解析:

QDataStream ds;
ds << rawData.mid(8,2);
ds << rawData.mid(13,2);
ds << rawData.mid(18,2);
ds << rawData.mid(23,2);

在你的情况下,这可以用这样的东西代替(目前无法测试,但认为应该可以):

QByteArray hexEncoded = rawData.right(rawData.size() - 6); // 6 is len of "MXTP24"

right() 给你修剪(右对齐)到指定长度的字节数组。然后:

QByteArray decoded = QByteArray::fromHex(hexEncoded);
quint32 sampleCounter = 0;
for (int i = 0; i < 4; ++i) {
    sampleCounter += (quint8)decoded.at(i) << (3 - i) * 8;
}

fromHex() 代替您处理 QByteArray 中的十六进制表示。 不幸的是,目前还没有找到更好的数字转换方法,导致 toInt 和 .data() 似乎不起作用(可能是 'hex' 字节数组开头的 0 的原因)

【讨论】:

    猜你喜欢
    • 2016-11-04
    • 2020-09-18
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多