2015-08-06 20 views
6

Stavo per utilizzare una lunga stringa per manipolare un numero elevato di bit di bit, mantenendo la stringa dei risultati in Redis. Tuttavia, incappato in un bug php (?). Un byte che contiene i bit 00001101 leggere utilizzando substr() restituisce un valore imprevisto:Perché il substr.status() cambia il byte di ritorno a capo ASCII?

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

Ideone

è il presupposto che è sbagliato substr() binary-safe? Ha anche provato mb_substr(), impostando la codifica su 8bit con esattamente lo stesso risultato.

risposta

4

Stai impostando a un intero13

Utilizzando substr() contro è colata in una stringa ("13")

Stai leggendo il primo carattere della stringa ("1")

utilizzando printf() con %b, si esegue il casting esplicito su un numero intero 1

l'argomento viene considerato come un numero intero e presentato come numero binario.

EDIT

Questo codice dovrebbe dare il risultato che ci si aspetta

$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

Grazie! Probabilmente ho creato un cattivo esempio/isolamento del problema. Originariamente ho una stringa binaria più lunga, leggendo un particolare byte da essa. Riscriverà l'esempio. – Serge

+0

Vero, ora capisco. Grazie ancora! – Serge