【问题标题】:Convert QByteArray from big endian to little endian将 QByteArray 从大端转换为小端
【发布时间】:2018-10-19 19:09:39
【问题描述】:

我想我在这里有点不知所措。我尝试了这么简单的事情,我不敢相信没有任何内置Qt(使用Qt 5.6.2)。我尝试将 QByteArray 中的数据从大端转换为小端。总是以这样的相同测试 QByteArray 开始。

QByteArray value;
value.append(0x01);
value.append(0x02);
value.append(0x03);
qDebug() << "Original value is: " << value.toHex(); // “010203” like expected

我需要的是小端,这意味着输出应该是“030201”。到目前为止,Qt 框架中是否有任何内置的东西?我没有找到。到目前为止我尝试了什么

// Try with build in QtEndian stuff
QByteArray test = qToLittleEndian(value);
qDebug() << "Test value is: " << test.toHex(); // 010203

// Try via QDataStream
QByteArray data;
QDataStream out(&data, QIODevice::ReadWrite);
out.setByteOrder(QDataStream::LittleEndian);
out << value;
qDebug() << "Changed value is: " << data.toHex(); // "03000000010203"

有什么好主意吗?还是我真的需要手动换手?在 SO 或 google 上没有发现任何有用的信息,或者可能提出了错误的问题......

【问题讨论】:

  • 单个字节在大端或小端中是相同的。这些字节是否代表其他数据类型?
  • 嗯..也许我走错了路?我需要更多的反向功能吗?这些字节直接来自一个测量单元,该单元以小端编码的形式将数据作为字节发送。数据是不同值的组合。所以首先我需要在工作之前更正数据。
  • 测量单位发送给您的确切数据类型是什么? charuint16_tdouble
  • 正如我之前所说的,它是一个复合值,需要通过解码 QByteArray 来解释。但这是稍后完成的。首先,我需要更改顺序。不要挂在数据类型上。正如问题中所写,我只想要另一个“正确”顺序的 QByteArray。
  • 字节序的概念只适用于多字节数据类型。所以“正确”的顺序取决于数据类型是什么。但如果你只想反转数组,我会使用 C++ 算法库中的std::reverse

标签: c++ qt endianness qbytearray


【解决方案1】:

听起来您想反转数组,而不是操纵数组内任何多字节类型的字节序。标准库对此有一个解决方案:

QByteArray arr;
std::reverse(arr.begin(), arr.end());
// arr is now in reversed order

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 2019-12-03
    • 1970-01-01
    • 2011-02-16
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多