【问题标题】:Storing integer to QByteArray using only 4 bytes仅使用 4 个字节将整数存储到 QByteArray
【发布时间】:2012-11-20 01:37:06
【问题描述】:

表示一个整数需要 4 个字节。如何将int 存储在QByteArray 中,以便只占用4 个字节?

  • QByteArray::number(..) 将整数转换为字符串,因此占用超过 4 个字节。
  • QByteArray((const char*)&myInteger,sizeof(int)) 似乎也不起作用。

【问题讨论】:

  • 实际上,第二个解决方案有效 :) 您只需将其正确地转换回来。将在计时器允许时发布答案,从而帮助其他人(我到处都看到很多这个问题,没有以 SO 方式正确解决:))
  • 我知道这有点过时了,但是cast it properly 是什么意思?在过去的 2 个小时里,我一直在尝试正确地投射它.. :D

标签: c++ qt integer qbytearray


【解决方案1】:

有几种方法可以将整数放入QByteArray,但以下通常是最干净的:

QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);

stream << myInteger;

这样做的好处是允许您相当方便地将多个整数(或其他数据类型)写入字节数组。它还允许您使用QDataStream::setByteOrder 设置数据的字节顺序。

更新

虽然上述解决方案可行,但QDataStream 用于存储整数的方法在 Qt 的未来版本中可能会发生变化。确保它始终有效的最简单方法是显式设置QDataStream 使用的数据格式的版本:

QDataStream stream(&byteArray, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_5_10); // Or use earlier version

或者,您可以完全避免使用QDataStream,而使用QBuffer

#include <QBuffer>
#include <QByteArray>
#include <QtEndian>

...

QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
myInteger = qToBigEndian(myInteger); // Or qToLittleEndian, if necessary.
buffer.write((char*)&myInteger, sizeof(qint32));

【讨论】:

  • 文档中不保证这会在字节数组中产生一个 4 字节的存储。
  • @StephenChu 在什么情况下不会产生4字节数组(尤其是myInteger的类型是qint32quint32)?
【解决方案2】:

@Primož Kralj 没有用他的第二种方法发布解决方案,所以这里是:

int myInt = 0xdeadbeef;
QByteArray qba(reinterpret_cast<const char *>(&myInt), sizeof(int));

qDebug("QByteArray has bytes %s", qPrintable(qba.toHex(' ')));

打印:

QByteArray has bytes ef be ad de

在 x64 机器上。

【讨论】:

    【解决方案3】:

    最近我遇到了同样的问题,但有一点变化。我必须将一个无符号短向量存储到 QByteArray 中。由于未知原因,QDataStream 的技巧不起作用。所以,我的解决方案是:

    QVector<uint16_t> d={1,2,3,4,5};
    QByteArray dd((char*)d.data(),d.size()*sizeof(uint16_t));
    

    取回向量的方法是:

    QVector<uint16_t> D;
    for(int i=0; i<dd.size()/sizeof(uint16_t); ++i){
      D.push_back(*(uint16_t*)(dd.data()+i*sizeof(uint16_t)) );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-12
      • 2013-07-14
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 2021-03-16
      • 2023-03-13
      相关资源
      最近更新 更多