MessagePack を使用して Delphi でレコードをシリアル化し、ZeroMQ TCP プロトコルを使用して Python サーバーに送信しようとしています。
b'\xa8DataType\x01\xa4data\xbf{"major":1,"minor":0,"build":2}\x00'
サーバー側でデシリアライズするのに問題があります。なぜこれが起こっているのですか?ある種のエンコーディングの問題ですか?ありがとう!
更新 #1:
私は、 www.msgpack.orgで推奨されているメッセージパック ライブラリ「QMsgPack」を使用しています。これが Delphi コードです。私のユーザー定義のレコードと列挙型:
Version = Record
major : Integer;
minor : Integer;
build : Integer;
end;
TDataType = (dtUnset, dtVersion, dtEntityDescription, dtEntityDescriptionVector, dtEntityState, dtEntityStateVector, dtCommandContinue, dtCommandComplete);
TPacket = Record
DataType : TDataType;
data : string;
end;
オブジェクトをシリアル化するコード:
begin
dmVersion.major := 1;
dmVersion.minor := 1;
dmVersion.build := 1;
lvMsg := TQMsgPack.Create;
lvMsg.FromRecord(dmVersion);
lvMsgString := lvMsg.ToString();
packet.DataType := dtVersion;
packet.data := lvMsgString;
lvMsg.Clear;
lvMsg.FromRecord(packet);
lvbytes:=lvMsg.Encode;
ZeroMQ.zSendByteArray(skt, lvbytes);
次に、Python サーバーで受信したバイト配列を次のように逆シリアル化しようとします。
b'\xa8DataType\x01\xa4data\xbf{"major":1,"minor":0,"build":2}\x00'
umsgpack.unpack()を使用して、結果を次のように出力します。
packet_packed = command.recv()
# Unpack the packet
umsgpack.compatibility = True
packet = umsgpack.unpackb( packet_packed )
print (packet)
for item in packet:
print (item)
これは私が画面に出力するものです:
b'DataType'
68
97
116
97
84
121
112
101
これが役立つことを願っています!ありがとう!
アップデート #2
これは、Python 側のサーバー コードです。VDS_PACKET_VERSION は、1 に設定された定数 int です。
# Make sure its a version packet
if VDS_PACKET_VERSION == packet[0]:
# Unpack the data portion of the packet
version = umsgpack.unpackb( packet[1] )
roster = []
if ( VDS_VERSION_MAJOR == version[0] ) and ( VDS_VERSION_MINOR == version[1] ) and ( VDS_VERSION_BUILD == version[2] ):
dostuff()
現在のシリアライズされたオブジェクトで
b'\x82\xa8DataType\x01\xa4data\xbf{"major":1,"minor":1,"build":1}'
私は得る
KeyError: 0 on packet[0]
何故ですか?