2010-07-14 8 views
5

¿Existe una forma nativa o económica de verificar la longitud de una cadena en bytes en PHP?Verifica la longitud de la secuencia binaria?

+2

¿Tiene un ejemplo de los datos? Porque si realmente es solo una cadena, no creo que tengas alternativas a strlen(). – sunetos

+0

@sunetos Es una cadena que contiene 16 bytes de datos binarios, para conectarla a un campo BINARIO en MySQL. No es una cadena de ceros y ceros codificados por el personaje ni nada por el estilo, si eso lo aclara. Si imprimes la cadena, recibes un galimatías. Lo que quiero hacer es verificar 16 bytes de datos. – Greg

Respuesta

-4

La longitud de una cadena (datos de texto) está determinada por la posición del carácter NULL que marca el final. En el caso de datos binarios, NULL puede estar a menudo en medio de los datos.

No se comprueba la longitud de los datos binarios. Tienes que saberlo de antemano. En su caso, la longitud es 16 (bytes, no bits, si es UUID).

En lo que se refiere a la validez del UUID, cualquier valor de 16 bytes es un UUID válido, por lo que no tiene suerte allí.

+0

Disculpas, quise decir bytes. Gracias por explicarlo. – Greg

+0

Esto es incorrecto. Sería correcto si PHP estuviese tratando cadenas como C, pero aparentemente tuvo una previsión sobre este problema exacto. –

2

En php.org, someone was nice enough to create this function. Simplemente multiplica por 8 y obtendrás muchos bits en esa cadena, ya que la función devuelve bytes.

+1

¿Entonces el strlen debería funcionar efectivamente para cadenas que contienen datos binarios aleatorios? – Greg

+0

No creo que strlen te brinde más que el número de caracteres, por lo que me vinculé a ese método. Pero incluso ese método parece diseñado para ser utilizado en una cadena que contiene caracteres. – 31eee384

+0

Creo que RiverC lo clavó arriba. Parece que si usas mbstring.func: overload, pierdes la capacidad de manejar datos binarios con las funciones de cadena PHP normales. –

16

Ver http://bytes.com/topic/php/answers/653733-binary-string-length

parte pertinente:

"En PHP, como en C, la cadena termina con un carácter cero, '\ 0', (char) 0, null-terminator, null-byte o lo que quieras llamarlo. "

No, ese no es el caso - cadenas de PHP se almacenan con la longitud y los datos , a diferencia de cadenas de C que se acaba de un puntero y utiliza un terminador. Son "binario-seguro" - NUL no termina la cadena.

Ver la definición de zvalue_value en zend.h; la parte de la cadena tiene un "char * val" e "int len".

problemas comenzarían si está usando el mbstring.func_overload, que cambia cómo funcionan strlen() y otras funciones, y lo hace tratar y tratar las cadenas como cadenas de caracteres en una codificación específica en lugar de una serie de bytes. Este no es el comportamiento normal de PHP.

La respuesta es que strlen debe devolver el número de bytes independientemente del contenido de la cadena. Para cadenas de caracteres de múltiples bytes, obtiene el número de caracteres incorrecto, pero el número correcto de bytes. Sin embargo, debe estar seguro de que no está utilizando la sobrecarga mbstring, que cambia la forma en que strlen se comporta.

2

En el caso de que haya mbstring conjunto sobrecarga o su están desarrollando para las plataformas en las que no está seguro acerca de este ajuste se puede hacer lo siguiente:

$len=strlen(bin2hex($data))/2; 

La razón por la que esto funciona es que en Hex se están garantizados para obtener 2 caracteres para todos los bytes que provienen de bin2hex (devuelve dos caracteres incluso para el 0 inicial binario).

nota que va a utilizar muchos más recursos que una normal de strlen (después de todo, por lo que debería hacer eso a la gran cantidad de datos si no es absolutamente necesario.

Cuestiones relacionadas