¿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?
Respuesta
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í.
Disculpas, quise decir bytes. Gracias por explicarlo. – Greg
Esto es incorrecto. Sería correcto si PHP estuviese tratando cadenas como C, pero aparentemente tuvo una previsión sobre este problema exacto. –
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.
¿Entonces el strlen debería funcionar efectivamente para cadenas que contienen datos binarios aleatorios? – Greg
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
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. –
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.
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.
- 1. longitud de la secuencia de Clojure
- 2. Predicción de secuencia binaria pseudoaleatoria
- 3. Obtener la longitud de la secuencia en EL
- 4. Escribir secuencia binaria de navegador usando PHP
- 5. obtener una longitud de contenido de la secuencia
- 6. Cálculo de la longitud de los objetos en la imagen binaria - algoritmo
- 7. expresión regular para definir alguna secuencia binaria
- 8. Serialización binaria para listas de longitud indefinida en Haskell
- 9. ¿Cómo convertir una cadena binaria de 16 bits de longitud fija a una de longitud fija?
- 10. Python: determinar la longitud de secuencia de elementos iguales en la lista
- 11. Verifica la existencia de la mesa antes de soltarla?
- 12. Asignación Desembalaje múltiple en Python cuando no se conoce la longitud de la secuencia
- 13. PHP: ¿verifica si la URL redirige?
- 14. Verifica si la cadena comienza con algo?
- 15. ¿Qué verifica la expresión 'v! == v'?
- 16. ¿Cómo verifica si la lista está en blanco?
- 17. java.util estadounidenseID.fromString sin verificar la longitud
- 18. Versión binaria de iostream
- 19. Cómo ver la representación binaria de la variable
- 20. ¿La adición de valores enum rompe la compatibilidad binaria?
- 21. ¿Cómo obtener la URL de la secuencia de mensajes conociendo la id de la secuencia?
- 22. búsqueda binaria vs árbol de búsqueda binaria
- 23. Truncar la longitud de la línea stdin?
- 24. Ignorar la serialización binaria en una propiedad
- 25. ¿Cómo probar la compatibilidad binaria automáticamente?
- 26. Algoritmo para la aritmética binaria en Java
- 27. Lote: longitud de la etiqueta
- 28. Longitud de la cadena cifrada
- 29. Longitud de la cadena sin usar el método de longitud()
- 30. Optimización de la serialización binaria para matrices genéricas multidimensionales
¿Tiene un ejemplo de los datos? Porque si realmente es solo una cadena, no creo que tengas alternativas a strlen(). – sunetos
@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