如何编写原始QByteArray或操作QByteArray

时间:2014-11-28 18:36:35

标签: qt qstring qtcpsocket qbytearray qiodevice

我定义了一个QIODevice(尤其是QTcpSocket),并希望将字符串写为原始格式。我通过以下示例描述了我的愿望:

char* string= "Hello World";

QByteArray bArray;
QDataStream stream(&bArray, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_4_6);
stream << string;

QFile file("Output.txt");
file.open(QIODevice::WriteOnly);
file.write(bArray);
file.close();

如果我打开Hex Editor中的Output.txt,我会得到以下结果:

00 00 00 0C  48 65 6C 6C 6F 20 57 6F 72 6C 64  00

00 00 00 0C = 4bytes (length of the following massage)
48 65 6C 6C 6F 20 57 6F 72 6C 64 = 11bytes (the string "Hello World")
00 = an one empty byte

但那不是我想要的。 是否可以将长度从4字节减少到2字节? 或者是否可以只获取字符串并定义我自己的2字节长度?

我之所以要问的是我想向服务器发送消息。但是服务器只接受以下格式的数据包:

00 0C  48 65 6C 6C 6F 20 57 6F 72 6C 64

00 0C = 2bytes
48 65 6C 6C 6F 20 57 6F 72 6C 64 = 11bytes

任何帮助都会很棒=)

1 个答案:

答案 0 :(得分:0)

如果您需要一种与QDataStream序列化不匹配的特殊序列化格式,那么您应该自己编写代码,而不是依赖于QDataStream并修改结果。它可能是这样的:

QByteArray byteArray;
...
QDataStream stream(..);
...
byteArray.chop(1); // to remove the 0 character at the end of c string
stream << quint16(byteArray.size()); // to write the size on 2 bytes
for(int i = 0; i < byteArray.size(); i++)
    stream << byteArray[i];