Re: binary zero evaluates as true!?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jon wrote:
Seriously guys... am I completely missing something important here? An empty array evaluates as false. The null character evaluates as false. The STRING "0" even evaluates as false yet a binary zero does not?

Even better yet bindec() doesn't appear to be binary safe so it will work for a string representation of binary data where the 0's and 1's are ascii characters but pass it an actual binary string and it always returns 0.

(sigh)

Someone help me understand this.  Isn't this a bug or oversight?

The character '0' (zero) is not the same as a byte with all bits turned off.

   (char) '0' = (binary) '00110000' = ord('0') = (int) 48

'bindec' returns the decimal equivalent of the binary number represented by the binary_string argument. Note the BINARY STRING key word. I'm guessing a Binary String is a string consisting of the characters '0' or '1' not bits. Each character is 8 bits, so a binary string is a sequence of the characters #48 and #49 from the ASCII table.

The 'character' ZERO is written with bits 00110000 in binary. This binary could be interpreted as either a character or an integer. If the binary is read as an integer, you'll get INT 48. INT 48 is NOT FALSE. Casting from string to int to 'binary string' is done even when you might not want it. Are you sure you are evaluating your binary '00000000' properly as you claim? Send a sample code, otherwise, see the following example:

--------------------------------------------------
<pre>
<?php

$zero = (string)'0';
$one = (string)'1';
var_dump($zero);
var_dump($one);
printf("char: %s, ord: %d, byte: %08b\n", $zero, ord($zero), $zero);
printf("char: %s, ord: %d, byte: %08b\n", $one, ord($one), $one);

// string(1) "0"
// string(1) "1"
// char: 0, ord: 48, byte: 00000000
// char: 1, ord: 49, byte: 00000001

$zero = (int)'0';
$one = (int)'1';
var_dump($zero);
var_dump($one);
printf("char: %s, ord: %d, byte: %08b\n", $zero, ord($zero), $zero);
printf("char: %s, ord: %d, byte: %08b\n", $one, ord($one), $one);

// int(0)
// int(1)
// char: 0, ord: 48, byte: 00000000
// char: 1, ord: 49, byte: 00000001

$zero = unpack('C', (string)'0');
$zero = array_pop($zero);
$one = unpack('C', (string)'1');
$one = array_pop($one);
var_dump($zero);
var_dump($one);
printf("char: %s, ord: %d, byte: %08b\n", $zero, ord($zero), $zero);
printf("char: %s, ord: %d, byte: %08b\n", $one, ord($one), $one);

// int(48)
// int(49)
// char: 48, ord: 52, byte: 00110000
// char: 49, ord: 52, byte: 00110001

?>
</pre>
--------------------------------------------------

Dante

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux