一個硬體往伺服器連接埠上發送資料(抓包軟得到的是正確的16進位),通過抓包軟體抓取的資料是正常的(16進位),然而通過php的socket接受到的資料(通過轉換後也是16進位,未轉換是亂碼),下面貼上代碼,請高手幫忙看下哪裡錯了。為什麼php的socket擷取的資料和抓包軟體擷取的不一樣
通過抓包軟體擷取的正確代碼是(16進位的):FA 01 01 FF AA 03 00 01 00 0B 00 00 00 A3
通過php socket獲得的資料(通過dechex(),ord()轉換後的,和軟體抓取的不一樣,是錯誤的):fa 7 25 2 fa 2 0 9 f6 4 2c 88 fa 1
下面貼上php的socket代碼:
= $MAX_USERS) { $reject = "Server full. Try again later.\n"; } //將當前用戶端串連放如socket_select選擇 $connections[$i] = $newconn; //輸入的串連資源緩衝容器 $writefds[$i] = $newconn; //串連不正常 if ($reject) { $close[$i] = true; } else { echo "Welcome to the PHP Chat Server!\n"; } //初始化當前串連讀取內容的緩衝容器 $input[$i] = ""; continue; } //用戶端串連 $i = (int)$rfd; //讀取 $tmp = @socket_read($rfd, 14, PHP_NORMAL_READ); if (!$tmp) { //讀取不到內容 print "connection closed on socket $i\n"; close($i); continue; } $input[$i] .= $tmp; $tmp = substr($input[$i], -1); /*if ($tmp != "\r" && $tmp != "\n") { // no end of line, more data coming continue; }*/ $line = trim($input[$i]); $input[$i] = ""; echo 'Client >>'.$line."\r\n";$data=str_split($line); print_r($data); echo "\r\n";//$data = explode("\t",$line);//$data=str_split($data);foreach($data as $v){ echo dechex(ord($v))."\t"; } echo "\r\n";socket_getpeername($connections[$i],&$remoteIP,&$remotePort);echo $remoteIP."\r\n";echo $remotePort."\r\n";//$data=str_split($buffer);//print_r($data);$str="\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01"; socket_send($connections[$i],$str,strlen($str),0); } foreach ($writefds as $wfd) { $i = (int)$wfd; $w = socket_write($wfd, "hello"); } } }function close($i){ global $connections, $input, $close; socket_shutdown($connections[$i]); socket_close($connections[$i]); unset($connections[$i]); unset($input[$i]); unset($close[$i]);}?>
回複討論(解決方案)
完全類比你的現場和代碼
$str="\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01";$line = $str;$data = str_split($line);foreach($data as $v){ echo dechex(ord($v))."\t";}得到
fa 1 1 ff aa aa 0 1 0 0 0 0 0 1
沒看出有什麼差別
完全類比你的現場和代碼
PHP code
$str="\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01";
$line = $str;
$data = str_split($line);
foreach($data as $v){
echo dechex(ord($v))."\t";
}
得到
f……
你這個類比的是發給硬體的資料是正常的,我的需求是:硬體發的資料我用socket接受不正常,通過抓包工具得到的資料是正確的(FA 01 01 FF AA 03 00 01 00 0B 00 00 00 A3),而用socket得到的資料,在dos下是亂碼,我通過dechex(ord(得到的資料))轉換後是:fa 7 25 2 fa 2 0 9 f6 4 2c 88 fa 1(是錯誤的),我想得到的是和抓包工具得到的一樣的資料(即:FA 01 01 FF AA 03 00 01 00 0B 00 00 00 A3)
你有 $line = trim($input[$i]); 這是接受到的資料吧?
1、去掉 trim,否則傳入的資料可能會被截斷
2、因為是位元據,你 echo base64_encode($input[$i]); 貼出結果
你有 $line = trim($input[$i]); 這是接受到的資料吧?
1、去掉 trim,否則傳入的資料可能會被截斷
2、因為是位元據,你 echo base64_encode($input[$i]); 貼出結果
+gclAvoCAAn2BCyI+gEB+v/6AQH/qqoAAQAAAAAAAfoBAf+qqgABAAAA
這是得到的資料
$s = base64_decode('+gclAvoCAAn2BCyI+gEB+v/6AQH/qqoAAQAAAAAAAfoBAf+qqgABAAAA');print_r(unpack('H*', $s));//或for($i=0; $i
你有 $line = trim($input[$i]); 這是接受到的資料吧?
1、去掉 trim,否則傳入的資料可能會被截斷
2、因為是位元據,你 echo base64_encode($input[$i]); 貼出結果
是通過抓包工具抓取的資料(正確的資料),圖中圈住陰影部分的16進位的資料如何轉換成箭頭所指的資料,以及如何再轉回到16進位
[img=http://bbs.php100.com/attachment/Mon_1208/18_219521_355456b7c8c862b.jpg?93][/img] 你收到的就是位元據,要轉來轉去幹什嗎?
你紅線框住的那些,是資料的十六進位表示。
一個位元組是8個二進位位,1個十六進位數是4個二進位位
2個十六進位數正好表示一個位元組的內容。
我現在用php socket收到的資料是箭頭所指的資料(並且放在變數$a中),我現在想將她轉換成圖中圈中陰影部分的資料(也就是16進位),改如何轉換呢?
你收到的就是位元據,要轉來轉去幹什嗎?
你紅線框住的那些,是資料的十六進位表示。
一個位元組是8個二進位位,1個十六進位數是4個二進位位
2個十六進位數正好表示一個位元組的內容。
我現在用php socket收到的資料是箭頭所指的資料(並且放在變數$a中),我現在想將她轉換成圖中圈中陰影部分的資料(也就是16進位),改如何轉換呢? 我 #6 不是給你代碼了嗎?
說的感覺有點亂,不好意思
是否有轉義符?
我 #6 不是給你代碼了嗎?
現在的確是可以擷取到代碼了,但是少了3個16進位的資料
擷取到的代碼是:fa072502fa020009f6042c88fa0101fafffa0101ffaa030001000b00
抓包得到的是:FA 01 01 FF AA 03 00 01 00 0B 00 00 00 A3
也就是少了 00 00 A3
可以完美解決你的問題。。。。。。剛看見這個你的問題