请教各位php解析2进制数据的问题

dongyao 发布于 2013/12/08 11:37
阅读 404
收藏 0
PHP

php接收2进制数据有如下问题:

2进制数据结构是这样的:

报文头部分:数据总长度(int 4字节)+用户信息(text 20字节)+命令id(int 4字节)+序号(int 8字节)

报文体部分:信息内容(int 8的倍数字节,经des加密),原始数据是按8个字节分段进行des加密的,不足8字节补0后加密。

现在的问题是:报文头解析都没问题了,但报文体如果原始数据<8字节,php端des解密没问题,只要>=8字节解密就是空的,相关代码如下:

$data = '';
$_rlen = 0;
$_header = '';
while ( $_rlen < 4 )
{
 $_str = socket_read($_sock, 4 - $_rlen);
 if ( $_str == "" ) break;  //no more data
 else {
  $_rlen += strlen($_str);
  $_header .= $_str; 
 }
}

echo 'header is:'.$_header;//这是数据总长度的4个字节内容
echo "\n\n";

//解码头信息中的4个字节(数据长度=头信息长度+数据体长度), 并且减去36得到Message Body的长度.
$_dlen = decode_big_endian($_header);  //这个函数只会处理4个字节.
echo "d_len is:".$_dlen;//数据总长度
echo "\n\n";
$_dlen -= 4;
echo "d_len is:".$_dlen;
echo "\n\n";

//读取全部数据.
$_rlen = 0;
$_data = '';
while ( $_rlen < $_dlen ) {
 $_str = socket_read($_sock, $_dlen - $_rlen);
 if ( $_str == "" ) break;
 else {
  $_rlen += strlen($_str);
  $_data .= $_str;
 }
}

 

//开始解析各部分数据

$input = $_data;

$account_into = substr($input,0,20);
$account = unpack('a*',$account_into);
echo 'accountis:'.$account[1];

$commandid_into = substr($input,20,4);
$commandid = unpack('N',$commandid_into);
echo 'commandidis:'.$commandid[1];

$sn_into = substr($input,24,4);
$sn = unpack('N',$sn_into);
echo 'sn_into is:'.$sn_into;
echo "\n\n";
echo 'snis:'.$sn[1];

$sn_into1 = substr($input,28,4);
$sn1 = unpack('N',$sn_into1);
echo 'snis:'.$sn1[1];

//以上部分都是报文头,都解析没问题

 

 

 

//以下部分是报文体,有问题

echo "\n\n";
echo "rest_into is:";
echo "\n\n";
echo $rest_into = substr($input,32,strlen($input)-32);//报文体部分,报文头固定是32字节长度
echo "\n\n";
$rest = unpack('a*',$rest_into);//解包报文体
echo "\n\n";
echo "rest_into:".strlen($rest_into);
echo "\n\n";
echo "rest[1]:";
echo $rest[1];
echo "\n\n";
echo "des is:";
$des = decrypt($rest[1],"12345678");
echo $des = trim($des);

 

测试原始报文体数据是1234567,可以正常解密出来,如果是12345678就不行了。

恳请高手解答,多谢!

 

加载中
0
宏哥
宏哥

unpack 函数处理二进制

一行代码搞定

0
dongyao
dongyao

老大能说细点么,针对我目前遇到这个问题

0
狮子的魂
狮子的魂
你的数据就是 $_data, 后面没必要在截取了, 直接对$_data DES解密就好了...
0
dongyao
dongyao

现在判断估计是des解密的问题,我用的如下函数(网上找的)

function encrypt($str, $key) 

    $block = mcrypt_get_block_size('des', 'ecb'); 
    $pad = $block - (strlen($str) % $block); 
    $str .= str_repeat(chr($pad), $pad); 
 
    return mcrypt_encrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB); 

 
function decrypt($str, $key) 
{   
    $str = mcrypt_decrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB); 
 
    $block = mcrypt_get_block_size('des', 'ecb'); 
    $pad = ord($str[($len = strlen($str)) - 1]); 
    return substr($str, 0, strlen($str) - $pad); 
}

 

原始要解密的明文数据只要是8的整数倍字节统统解密为空。。。其他一律都能解开,比如原文是1234567,解密没问题,如果是12345678就不行了或者1234567f也不行,继续请教楼上高手。

0
dongyao
dongyao
顶高手!
返回顶部
顶部