7

以下で使用しているのと同じエンディアンでバイトをintに変換できるQt関数を見つけようとしています。私は間違いなくここで車輪の再発明をしているように感じます、そしてこれを行うためにQtライブラリに何かがすでにあるに違いありません。それは存在しますか?

// 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.
    }
}

編集:データは常にビッグエンディアンであるため(OSに関係なく)、たとえば101は[0、0、0、101]になり、78000は[0、1、48、176]になります。

4

3 に答える 3

3

次の機能はあなたのニーズに合っているようです:

から : #include <QtEndian>

于 2015-01-19T14:02:28.603 に答える
1

十分QByteArrayではないでしょうか?QDataStream

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またはrawバッファに書き戻すこともできます(QByteArray::fromRawData()後者に使用)。

于 2012-07-06T23:09:41.023 に答える
1

あなたのコードは非常にシンプルでわかりやすいですが、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);
}

エンディアンは、それが実行されているマシンと同じになることに注意してください。

于 2012-07-07T01:04:02.743 に答える