XML リクエストを送受信する XML ソケット サーバーを扱っています。
サーバーは、メッセージの長さを示す文字列に 2 バイトの 16 進数のプレフィックスを必要とします。XML ソケットに接続するときに受け取るメッセージは次のとおりです。
受信した XML 文字列
<?xml version="1.0" encoding="UTF-8"?>
<Iso8583PostXml>
<MsgType>0800</MsgType>
<Fields>
<Field_007>xxx</Field_007>
<Field_011>xxx</Field_011>
<Field_012>xxx</Field_012>
<Field_013>xxx</Field_013>
<Field_070>001</Field_070>
</Fields>
</Iso8583PostXml>
HEX に変換された文字列
01013c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d38223f3e0d0a3c49736f38353833506f7374586d6c3e3c4d7367547970653e303830303c2f4d7367547970653e3c4669656c64733e3c4669656c645f3030373e303831323136323235373c2f4669656c645f3030373e3c4669656c645f3031313e3139323235373c2f4669656c645f3031313e3c4669656c645f3031323e3139323235373c2f4669656c645f3031323e3c4669656c645f3031333e303831323c2f4669656c645f3031333e3c4669656c645f3037303e3030313c2f4669656c645f3037303e3c2f4669656c64733e3c2f49736f38353833506f7374586d6c3e
送信された XML メッセージの長さである 16 進数に変換すると、「0101」で始まることがわかります。このメッセージを XML にデコードするには、メッセージを 16 進文字列に変換し、最初の 4 文字を切り落とします。その後、simplexml_load_string で機能します - 「0101」を削除しないと、XML は解析されません - エコーしても受け取った文字列は、先頭に何も追加されていない通常の xml のように見えます。
私が返す応答は、XML 文字列です。
<?xml version="1.0" encoding="UTF-8"?>
<Iso8583PostXml>
<MsgType>0810</MsgType>
<Fields>
<Field_007>xxx</Field_007>
<Field_011>xxx</Field_011>
<Field_012>xxx</Field_012>
<Field_013>xxx</Field_013>
<Field_070>001</Field_070>
<Field_039>00</Field_039>
</Fields>
</Iso8583PostXml>
これは 322 の長さです。私がする必要があるのは、この長さを 2 バイトの 16 進値として文字列に接頭辞として付け、受信したメッセージと同じようにメッセージを送り返すことです。
その322 hexヘッダーを文字列に設定する方法を知っている人はいますか?
[アップデート]
私は次のことを試しました:
$hex_string = bin2hex($length.$xml);
$send_xml = pack('H*', $hex_string);
echo "Sending acknowledgement...\n";
$result = socket_write($socket, $send_xml, $length);
echo $send_xml;
$send_xml は、長さを XML の前に文字列として出力しています
322<?xml version="1.0" encoding="UTF-8"?>
<Iso8583PostXml>
<MsgType>0810</MsgType>
<Fields>
<Field_007>0813063726</Field_007>
<Field_011>093726</Field_011>
<Field_012>093726</Field_012>
<Field_013>0813</Field_013>
<Field_070>001</Field_070>
<Field_039>00</Field_039>
</Fields>
</Iso8583PostXml>
これは機能していません..どうにかして、その 322 を xml 文字列の 2 バイトのプレフィックスに書き込む必要があります