将 QByteArray 从大端序转换为小端序

4

我觉得有点困惑了。我正在尝试一个简单的事情,但是令人难以置信的是,在Qt(使用Qt 5.6.2)中没有内置的方法来将QByteArray中的数据从big endian转换为little endian。我试着用以下测试QByteArray开头:

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

我需要的是小端字节序,也就是输出应该是“030201”。在Qt Framework中有没有内置的东西可以实现这个功能呢?我没有找到。目前我尝试过:

// 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或谷歌上没找到有帮助的东西,或者可能是我问的问题不对...


2
一个字节在大端序和小端序中是一样的。这些字节代表了其他的数据类型吗? - bnaecker
嗯...也许我走错了路?我需要更多的反转函数吗?这些字节直接来自发送数据的测量单元,它们以小端编码的字节形式发送数据。数据是由不同的值组合在一起的。因此,在开始工作之前,我需要先纠正数据。 - sandkasten
测量单位发送给您的确切数据类型是什么?charuint16_tdouble等。 - bnaecker
正如我之前所提到的,这是一个复合值,需要通过解码QByteArray来进行解释。但这是后来才做的事情。首先,我需要改变顺序。不要纠结于数据类型。正如问题中所写的那样,我只想要另一个按照“正确”顺序排列的QByteArray。 - sandkasten
3
字节序只适用于多字节数据类型,所以“正确”的顺序取决于数据类型。但如果你只想反转数组,我建议使用 C++ 算法库中的 std::reverse - bnaecker
没错,你把我引到了正确的轨道上,std::reverse正是我所需要的!请将您的评论和解决方案放在答案中,我稍后会接受它,现在我要离开了,谢谢! - sandkasten
1个回答

10

看起来你想要翻转数组,而不是操纵数组内任何多字节类型的字节顺序。标准库有一个解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接