Manipulación de bytes en PHP

En PHP, si tiene una variable con datos binarios, ¿cómo obtiene bytes específicos de los datos? Por ejemplo, si tengo algunos datos de 30 bytes de longitud, ¿cómo obtengo los primeros 8 bytes?

En este momento, lo estoy tratando como una cadena, usando la función substr() :

 $data = //... $first8Bytes = substr($data, 0, 8); 

¿Es seguro usar substr con datos binarios?

¿O hay otras funciones que debería usar?

En general, todas las funciones de cadena en PHP son seguras para usar con bytes sin formato. El problema que mayormente surge son los bytes nulos, pero solo para las funciones del sistema de archivos: http://php.net/manual/en/security.filesystem.nullbytes.php

Su substr() está perfectamente bien para usar con cadenas binarias. ereg embargo, algunas otras funciones como ereg y ereg a C, donde el carácter “\ 0” se convierte en un problema.

Si la extensión mbstring está instalada y la sobrecarga mbstring está habilitada, entonces el uso de substr puede substr problemas. La sobrecarga Mbstring hará que mb_substr se mb_substr automáticamente cada vez que se invoque substr (si mbstring está instalado y la sobrecarga mbstring está deshabilitada , entonces substr recuperará correctamente los bytes). El siguiente código usará mb_substr si mbstring está instalado y substr si no lo está. Se utiliza la encoding de caracteres “8 bits”, que tratará a cada carácter como 1 byte e ignorará los terminadores nulos (‘\ 0’).

 if (function_exists('mb_substr')) { $bytes = mb_substr($string, 0, 8, '8bit'); } else { $bytes = substr($string, 0, 8); } 

Gracias a ircmaxell

Suena bien ya que PHP está tratando cadenas (internamente) “me gusta” C char * (1byte = 1char)

Por otro lado, podría romperse si la cadena está en encoding Unicode (2 bytes = 1 carácter)

nb: también puedes jugar con pack () y unpack () para manipular bytes “reales”