Qt uint类型是如何序列化的?

时间:2014-08-26 12:05:47

标签: c++ qt

我正在使用QDataStream来序列化一些uint变量。一些值及其相应输出的例子:

quint32 i;

i = 99
[0,0,0,99]

i = 255
[0,0,0,255]

i = 256
[0,0,1,0]

i = 510
[0,0,1,254]

i = 512
[0,0,2,0]

i = 1024
[0,0,4,0]

这次转换是如何完成的?

这是我用来打印输出的内容。

QByteArray barr;
QDataStream stream(&barr,QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_4_8);

quint32 i32 = 512;

stream << i32;

QList<int> valueList;
for(int i = 0 ; i < barr.count() ; ++i)
    valueList.append(QChar(barr.at(i)).unicode());

qDebug() << valueList;

3 个答案:

答案 0 :(得分:1)

编辑:

显然

xi = (quint8 )(X >> (8*i))

其中X是原始quint32i字节索引和xi您提供的输出中的第i位数。他们执行的序列化就像

一样简单
quint8* data = (quint8*)(&X);

unsigned char* data = (unsigned char*)(&X);
xi = data[i]

序列化确实取决于字节顺序。这就是为什么QDataStreamproperties的原因,例如

  • QDataStream::ByteOrder
  • QDataStream::FloatingPointPrecision

答案 1 :(得分:1)

这看起来像一个基于索引的编码乘以256向下添加。我会告诉你列表中的“大”数字。

i = 510
[0,0,1,254]

510 = 1 * 256 + 254

i = 512
[0,0,2,0]

512 = 2* 256 + 0

遵循逻辑,很容易看到模式...

答案 2 :(得分:1)

看起来像标准big-endian表示。这就是整数在计算机内存中实际被分成字节的方式。例如:

510 = 0 * (1 << 24) + 0 * (1 << 16) + 1 * (1 << 8) + 254

字节的相反顺序,little-endian,现在更受欢迎。您可以选择QDataStream。setByteOrder()。

以下是将32位整数拆分为字节的代码:

void putUint32BigEndian(quint32 x)
{
     putByte(x >> 24);
     putByte((x >> 16) & 0xff);
     putByte((x >> 8) & 0xff);
     putByte(x & 0xff);
}