Qt是否有一种将字节转换为int的方法,反之亦然

Does Qt have a way of converting bytes to int and vice versa?

本文关键字:int 转换 方法 反之亦然 字节 是否 一种 Qt      更新时间:2023-10-16

我正试图找到一个Qt函数,它可以将字节转换为int,其endianness与我下面使用的endianness相同。我觉得我肯定在重新发明轮子,而且Qt-libs中肯定已经有东西可以做到这一点了。它存在吗?

// TODO: qt must have a built in way of converting bytes to int.
int IpcReader::bytesToInt(const char *buffer, int size)
{
    if (size == 2) {
        return
            (((unsigned char)buffer[0]) << 8) +
              (unsigned char)buffer[1];
    }
    else if (size == 4) {
        return
            (((unsigned char)buffer[0]) << 24) +
            (((unsigned char)buffer[1]) << 16) +
            (((unsigned char)buffer[2]) << 8) +
              (unsigned char)buffer[3];
    }
    else {
        // TODO: other sizes, if needed.
        return 0;
    }
}
// TODO: qt must have a built in way of converting int to bytes.
void IpcClient::intToBytes(int value, char *buffer, int size)
{
    if (size == 2) {
        buffer[0] = (value >> 8) & 0xff;
        buffer[1] = value & 0xff;
    }
    else {
        // TODO: other sizes, if needed.
    }
}

编辑:数据是总是big-endian(无论什么操作系统),所以例如101是[0,0,01101],78000是[0],1,48176]。

以下功能似乎适合您的需求:

  • qFromBigEndian()

  • qToBigEndian()

发件人:#include <QtEndian>

您的代码非常简单易懂,但您可以像这样使用Qt的QByteArray(注意:我没有尝试编译它):

int IpcReader::bytesToInt(const char *buffer, int size)
{
  QByteArray b(buffer, size);
  return b.toInt();
}
void IpcClient::intToBytes(int value, char *buffer, int size)
{
  QByteArray b = QByteArray::number(value);
  strncpy(buffer, (const char*)b, size);
}

请注意,endianness将与运行它的机器相同。

QByteArrayQDataStream是否足够?

int IpcReader::bytesToInt(const char *buffer, int size)
{
    QByteArray byteArr(buffer,size);
    QDataStream ds(&byteArr,QIODevice::ReadOnly);
    if(little_endian_usage) // little endian check or something similar here
         ds.setByteOrder(QDataStream::LittleEndian);
    else
         ds.setByteOrder(QDataStream::BigEndian);
    int ret;
    if(size == 2){
        qint16 tmp;
        ds >> tmp;
        ret = tmp;
    } else if(size == 4){
        qint32 tmp;
        ds >> tmp;
        ret = tmp;
    } else if(size == 1){
        qint8 tmp;
        ds >> tmp;
        ret = tmp;
    }
    return ret;
}

如果您不想创建缓冲数据的副本,可以使用QByteArray byteArr = QByteArray::fromRawData(buffer, size)。您也可以使用QDataStream将int写回QByteArray或原始缓冲区(后者使用QByteArray::fromRawData())。