0

QIODevice (特に QTcpSocket) を定義し、文字列を raw 形式で書き込みたいと考えています。次の例で私の願いを説明します。

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

どんな助けでも素晴らしいでしょう=)

4

1 に答える 1

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];
于 2014-11-29T08:54:02.827 に答える