Как написать сырой QByteArray или манипулировать QByteArray

Я определил 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 в Hex Editor, я получу следующий результат:

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 ответ

Если вам нужен специальный формат сериализации, который не совпадает с сериализацией 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];
Другие вопросы по тегам