ID: 35817 User updated by: lynjwxm at hotmail dot com Reported By: lynjwxm at hotmail dot com Status: Closed Bug Type: Strings related Operating System: rhel as 3 PHP Version: 5.1.1 New Comment:
It seems that the previous comments which regard this bug as a bogus one has gone......anyway,thanks for your quickly response. Previous Comments: ------------------------------------------------------------------------ [2005-12-28 21:57:26] [EMAIL PROTECTED] This bug has been fixed in CVS. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. ------------------------------------------------------------------------ [2005-12-28 09:58:38] lynjwxm at hotmail dot com and it seems php has the diffrent behavior with perl's: perl's behavior for 3 bytes(odd bytes) $out=pack "H3","181"; $out1=unpack "H3",$out; print $out1; --------------- expect result: 181 --------------- actual result: 181 perl's behavior for one byte(odd bytes) $out=pack "H","8"; $out1=unpack "H",$out; print $out1; --------------- expect result: 8 --------------- actual result: 8 perl's behavior for 4 byte(even bytes) $out=pack "H4","1818"; $out1=unpack "H4",$out; print $out1; --------------- expect result: 1818 --------------- actual result: 1818 So, can I say it is a bug? ------------------------------------------------------------------------ [2005-12-28 04:12:44] lynjwxm at hotmail dot com simplest: <?php $a=pack("H","8"); var_dump($a); var_dump(bin2hex($a)); $b=unpack("H",$a); var_dump($b); ?> --------------- string(1) " " string(2) "80" array(1) { [1]=> string(0) "" } --------------- Do you mean I can not pack hex string "8"? I should only pack hex string "88" or so? ------------------------------------------------------------------------ [2005-12-28 02:30:28] lynjwxm at hotmail dot com in source code: in func: PHP_FUNCTION(pack) switch ((int) code) { case 'h': case 'H': INC_OUTPUTPOS((arg + 1) / 2,1) /* 4 bit per arg */ break; in func: PHP_FUNCTION(unpack) case 'h': case 'H': size = (arg > 0) ? arg / 2 : arg; arg = 1; break; we can find that when we pack an odd number bytes hexstring in function pack(),it add an extra byte of '0'.But it did not do so in function unpack(). <?php $a = pack("H3i", "1810", 513); var_dump(bin2hex($a)); var_dump(unpack("H3/iabc", $a)); ?> before change code, result: string(12) "181001020000" array(2) { [1]=> string(2) "18" ["abc"]=> int(131344) } -- size = (arg > 0) ? arg / 2 : arg; ++ size = (arg > 0) ? (arg + 1) / 2 : arg; after change code, result: string(12) "181001020000" array(2) { [1]=> string(4) "1810" ["abc"]=> int(513) } ------------------------------------------------------------------------ [2005-12-27 10:40:49] lynjwxm at hotmail dot com Description: ------------ (sorry for my poor english.....) It seems unpack can not deal with an odd number of hex string args. Under a xterm, it will cause "xterm" displayed on term. Reproduce code: --------------- <?php $a=pack("H3i","181",5); $b=unpack("H3/ias",$a); var_dump($b); ?> Expected result: ---------------- array(2){ [1]=> string(3)"181" ["as"]=> int(5) } Actual result: -------------- array(2){ [1]=> string(2)"18" ["as"]=> int(1296) } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=35817&edit=1