我正在处理一个 XML 套接字服务器,我从/向它接收和发送 XML 请求。
服务器要求字符串有一个 2 字节的十六进制前缀,表示消息的长度;连接到 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
当我将其转换为十六进制时,您可以看到以“0101”开头,这是发送的 XML 消息的长度。为了将此消息解码为 XML,我将其转换为十六进制字符串,然后切掉前 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 字节十六进制值添加到字符串的前缀,然后将消息发送回来,与我收到的消息相同。
有谁知道如何将 322 十六进制标头设置为字符串?
[更新]
我尝试过执行以下操作:
$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 字节前缀