Bug #61038 [Opn]: unpack("a5", "str\0\0") does not work as expected

From: Date: Mon, 13 Feb 2012 09:50:28 +0000
Subject: Bug #61038 [Opn]: unpack("a5", "str\0\0") does not work as expected
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-167469@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=61038&edit=1

 ID:                 61038
 User updated by:    su dot hang at yahoo dot com
 Reported by:        su dot hang at yahoo dot com
 Summary:            unpack("a5", "str\0\0") does not work as expected
 Status:             Open
 Type:               Bug
 Package:            *General Issues
 Operating System:   Linux (3.0.0-15-generic)
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

yes, that's right. 

"a", as in the spec, represents arbitrary binary string, with null-padding. so, if the
specified unpack length is fixed, such as a constant number (like in
"unpack('a10')"), then the unpacked string from "a" should have that
length (unless, of course, if the input is insufficient). 

since "a" is arbitrary binary string, if it has several "\0"s at the end, php
should not remove them as if it was a regular null-terminated string.


Previous Comments:
------------------------------------------------------------------------
[2012-02-13 08:39:00] cataphract@php.net

I'm not sure I understand. Is the problem that 'a' (as opposed to 'A') on
unpack should leave the string as is, as is the case with perl?

------------------------------------------------------------------------
[2012-02-10 16:53:54] su dot hang at yahoo dot com

sorry, please use the test script instead of the subject.

It is a bug because it is against the spec that "a" is an arbitrary binary string. 
If specified length is 5 then it should be null-padded at the end, rather than being 
truncated.

try unpack('a5', "\x12\x34\x00\x56\x00").
at least, to be consistent, the result string should terminate at the first "\0", 
instead of the trailing one.

btw, perl is handling it correctly.

------------------------------------------------------------------------
[2012-02-10 16:34:10] cataphract@php.net

I don't see anything wrong here. 

unpack("a5", "foo\0\0")

removes the NULL padding from the input string. The 5 specifies only the size of the input to
consume:

php > var_dump(unpack("a5", "foo\0"));
PHP Warning:  unpack(): Type a: not enough input, need 5, have 4 in php shell code on line 1

------------------------------------------------------------------------
[2012-02-10 09:20:26] su dot hang at yahoo dot com

Description:
------------
related bug: https://bugs.php.net/bug.php?id=39588

if unpacking from a binary string ending with any number of "\0"'s, and the unpack
string length is given, the resulted string does not have the right length. 

for example, unpack("a5", "str\0") should result in a 5-byte-long string, but it
returns a 3-byte-long instead. 

Test script:
---------------
<?php
$var = "str";
$packed = pack("a5", $var); // 5 bytes long NULL-padded string
var_dump(unpack("a5", $packed));


Expected result:
----------------
array(1) {
  [1]=>
  string(5) "str\0\0"
}

Actual result:
--------------
array(1) {
  [1]=>
  string(3) "str"
}


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=61038&edit=1


Thread (6 messages)

« previous php.bugs (#167469) next »