QByteArray 到 Int 的转换

Posted

技术标签:

【中文标题】QByteArray 到 Int 的转换【英文标题】:QByteArray to Int conversion 【发布时间】:2017-11-29 13:29:31 【问题描述】:

我正在尝试使用以下代码将QByteArray 转换为int

int byteArrayToint(const QByteArray &ba, QDataStream::ByteOrder byteOrder)

    int val = 0;
    QDataStream stream(ba);
    stream.setByteOrder(byteOrder);
    stream >> val;
    return val;

然后在main函数中:

    ....
    QByteArray ba;
    ba[0]=0x20;
    ba[1]=0x17;

    for(int i(0); i < ba.size(); i++)
        qInfo() << QString("0x%1").arg((int)ba.at(i), 2, 16);

    qInfo() << "date =" << byteArrayToint(ba, QDataStream::BigEndian);
    ...

输出是:

"0x20"
"0x17"
date = 0

但是如果我使用 QByteArray("Hello") 而不是以前的,它会给出预期的结果:

"0x48"
"0x65"
"0x6c"
"0x6c"
"0x6f"
date = 1214606444

到目前为止,我找不到错误在哪里。我知道使用位移的方法效果很好,但我想了解为什么我在 Qt 类中没有得到相同的结果。

感谢您的帮助。

【问题讨论】:

阅读后检查流status(),我猜你会得到“阅读结束”状态。 我猜你使用的 int 是 4 个字节,而你只在 QByteArray 中放了 2 个字节!? @Mat 你是对的。我没有注意这一点。在我根据 Endianess 添加零后,它按预期工作。谢谢。 【参考方案1】:

在这一行:

stream >> val;

您正在将流中的 sizeof(int) 字节读入变量 val。

鉴于 sizeof(int) 为 4,任何大小至少为 4 个字节的字节数组都可以生成一些 int 值(其余字节将被忽略)。

【讨论】:

以上是关于QByteArray 到 Int 的转换的主要内容,如果未能解决你的问题,请参考以下文章

Qt6-QByteArray分析

从 QByteArray 以 bigendian 格式获取浮点数组的有效方法

QByteArray::number(int) 只有两个字节长

vs2013 提示无法从void转换为char

《Qt数据类型》--QByteArray,QString,int,hex之间的转化

如何将 cv::mat 标头和数据部分转换为单个 qbytearray?