2015-08-06 9 views
6

Ich würde eine lange Zeichenfolge verwenden, um eine große Anzahl von Bitflags zu manipulieren, wobei die Ergebniszeichenfolge in Redis bleibt. Stolperte jedoch über einen PHP-Bug (?). Ein Byte, das Bits enthält 00001101 mit substr() gibt einen unerwarteten Wert zu lesen:Warum ändert PHP substr() das ASCII Wagenrücklaufbyte?

$bin = 0b00001101; // 13 - ASCII Carriage return 
$c = substr($bin, 0, 1); // read this character 
printf("Expectation: 00001101, reality: %08b\n", $c); // 00000001 

Ideone

Ist die Annahme, dass substr() binary safe falsch ist? Auch versucht mb_substr(), Codierung auf 8bit mit genau dem gleichen Ergebnis einstellen.

Antwort

4

Sie auf eine integer13

Mit substr() gegen Einstellung wirft auf eine String ("13")

Sie sind das erste Zeichen dieser Zeichenfolge Lesen ("1")

Verwendung printf() mit %b, werden Sie diese Zeichenfolge explizit zurück in eine ganze Zahl 1

das Argument wird als eine ganze Zahl behandelt und als eine Binärzahl dargestellt.

EDIT

Dieser Code sollte das Ergebnis geben, die Sie erwarten

$bin = 0b00001101; // 13 - ASCII Carriage return 
$c = substr(chr($bin), 0, 1); // read this character 
printf("Expectation: 00001101, reality: %08b\n", ord($c)); // 00001101 
+0

Dank! Wahrscheinlich habe ich ein schlechtes Beispiel/Isolation des Problems erstellt. Ursprünglich habe ich eine längere binäre Zeichenkette und lese ein bestimmtes Byte daraus. Wird das Beispiel umschreiben. – Serge

+0

Stimmt, jetzt verstehe ich es. Danke noch einmal! – Serge