我正在使用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;
答案 0 :(得分:1)
编辑:
显然
xi = (quint8 )(X >> (8*i))
其中X
是原始quint32
,i
字节索引和xi
您提供的输出中的第i位数。他们执行的序列化就像
quint8* data = (quint8*)(&X);
或
unsigned char* data = (unsigned char*)(&X);
xi = data[i]
序列化确实取决于字节顺序。这就是为什么QDataStream
有properties的原因,例如
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);
}