Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将XML套接字post的消息长度编码为2字节十六进制_Php_Xml_String_Sockets_Hex - Fatal编程技术网

PHP将XML套接字post的消息长度编码为2字节十六进制

PHP将XML套接字post的消息长度编码为2字节十六进制,php,xml,string,sockets,hex,Php,Xml,String,Sockets,Hex,我正在处理一个XML套接字服务器,我从/向该服务器接收和发送XML请求 服务器需要为指示消息长度的字符串添加2字节十六进制前缀;连接到XML套接字时收到的消息如下: 接收到XML字符串 <?xml version="1.0" encoding="UTF-8"?> <Iso8583PostXml> <MsgType>0800</MsgType> <Fields> <Field_007>xxx</Field_007

我正在处理一个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>
当我将其转换为十六进制时,您可以看到以“0101”开头,十六进制是发送的XML消息的长度。要将此消息解码为XML,我将其转换为十六进制字符串,然后切掉前4个字符,然后在simplexml_load_字符串中工作-如果我不删除XML不解析的“0101”,即使我回显收到的字符串,它看起来像普通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>
$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
0810
0813063726
093726
093726
0813
001
00
这是行不通的。。不知何故,我需要将322写入xml字符串的2字节前缀中

检查php函数包(),格式为h或h,具体取决于xml套接字服务器的结尾


但它应该会让你朝着正确的方向前进

试试下面的代码它对我来说很有用

function sendSocketRequest($XmlString, $Socket_Request) {
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }

    if (!socket_connect($sock, $Socket_Request['HostName'], $Socket_Request['Port'])) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not connect: [$errorcode] $errormsg \n");
    }

    $status = socket_write($sock, pack_int32be(strlen($XmlString)), 4);
    $status = socket_write($sock, $XmlString, strlen($XmlString));
    $response = socket_read($sock, $this->_socketReadLength);

    socket_close($sock);
    return substr($response, 2);
}

function pack_int32be($i) {
    if ($i < -2147483648 || $i > 2147483647) {
        die("Out of bounds");
    }
    return pack('C4', ($i >> 24) & 0xFF, ($i >> 16) & 0xFF, ($i >> 8) & 0xFF, ($i >> 0) & 0xFF
    );
}
$socketResponse = sendSocketRequest($yourXMLString, array('HostName'=>'<HostName>','Port'=>'<Port>');
函数sendSocketRequest($XmlString,$Socket\u请求){ if(!($sock=socket\u create(AF\u INET,sock\u STREAM,0))){ $errorcode=socket\u last\u error(); $errormsg=socket\u strerror($errorcode); die(“无法创建套接字:[$errorcode]$errormsg\n”); } 如果(!socket_connect($sock,$socket_Request['HostName'],$socket_Request['Port'])){ $errorcode=socket\u last\u error(); $errormsg=socket\u strerror($errorcode); die(“无法连接:[$errorcode]$errormsg\n”); } $status=socket\u write($sock,pack\u int32be(strlen($XmlString)),4); $status=socket_write($sock,$XmlString,strlen($XmlString)); $response=socket\u read($sock,$this->\u socketReadLength); 插座关闭($sock); 返回substr($response,2); } 功能包_int32be($i){ 如果($i<-2147483648 | |$i>2147483647){ 死亡(“出界”); } 返回包('C4'、($i>>24)和0xFF、($i>>16)和0xFF、($i>>8)和0xFF、($i>>0)和0xFF ); } $socketResponse=sendSocketRequest($yourXMLString,数组('HostName'=>'','Port'=>'');
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>
function sendSocketRequest($XmlString, $Socket_Request) {
    if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }

    if (!socket_connect($sock, $Socket_Request['HostName'], $Socket_Request['Port'])) {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);
        die("Could not connect: [$errorcode] $errormsg \n");
    }

    $status = socket_write($sock, pack_int32be(strlen($XmlString)), 4);
    $status = socket_write($sock, $XmlString, strlen($XmlString));
    $response = socket_read($sock, $this->_socketReadLength);

    socket_close($sock);
    return substr($response, 2);
}

function pack_int32be($i) {
    if ($i < -2147483648 || $i > 2147483647) {
        die("Out of bounds");
    }
    return pack('C4', ($i >> 24) & 0xFF, ($i >> 16) & 0xFF, ($i >> 8) & 0xFF, ($i >> 0) & 0xFF
    );
}
$socketResponse = sendSocketRequest($yourXMLString, array('HostName'=>'<HostName>','Port'=>'<Port>');