【问题标题】:How to write a raw QByteArray or manipulate the QByteArray如何编写原始 QByteArray 或操作 QByteArray
【发布时间】:2015-01-27 10:43:50
【问题描述】:

我定义了一个 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();

如果我在十六进制编辑器中打开 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

任何帮助都会很棒 =)

【问题讨论】:

  • 好吧,QByteArray[] 运算符,所以你可以将它用作常规数组,只需将数据移动到“左侧”2 个字节,然后调整数组大小以在最后修剪它。或者只是将其复制到另一个字节数组中,同时跳过前 2 个字节。

标签: qt qstring qtcpsocket qbytearray qiodevice


【解决方案1】:

如果你需要一个特殊的序列化格式与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];

【讨论】:

    猜你喜欢
    • 2019-07-25
    • 2017-03-24
    • 2020-12-08
    • 2015-01-28
    • 2016-03-10
    • 2018-02-17
    • 1970-01-01
    • 2013-12-25
    • 2018-02-25
    相关资源
    最近更新 更多