2011-12-12 13 views
7

Estoy leyendo el Lua reference manual, y habla de "ceros incrustados", simbolizados por "\ 0".¿Qué es un cero incrustado?

Cuando trato de verlo en la consola Lua, imprime nada significativo:

> print "a \0 b" 
a 

Entonces, ¿qué es esto "cero incrustado"?

+1

Parece que es el valor NULL .. – clyfe

+0

'NUL', es decir, el byte cero. – lhf

Respuesta

14

Cada carácter tiene una representación numérica interna, como \ 97 para 'a'. Un carácter con código \ 0 no representa ningún carácter visible, pero se usa como terminador en C y en otros lenguajes de programación.

El manual quiere dejar en claro que un '\ 0' es no un terminador en Lua. También significa que puede cargar bytes arbitrarios en una cadena (imagen, audio, video, código nativo, etc.) y no corre el riesgo de que sea truncado en el primer '\ 0' por alguna función de la biblioteca (lo que podría suceder en C si usa funciones relacionadas con cadenas).

+1

Bueno, parece que imprimir en Lua 5.1 trunca la salida. Supongo que es solo un caso de esquina, y se va a solucionar en la próxima Lua 5.2 – marcus

+0

, la salida es un efecto secundario de imprimir usando 'puts' de C – daurnimator

0

El carácter nulo a menudo se representa como la secuencia de escape \ 0 en literales de cadena de código fuente o constantes de caracteres.

Wikipedia Null Character

1

que va a ser similar a poner un carácter nulo en una cadena C. Aunque su salida de impresión no muestra el carácter b, otras funciones de Lua deberían funcionar con la longitud completa de la cadena (a diferencia de las funciones de manipulación de cadenas C que funcionan con cadenas terminadas NULL).

Un uso de esto sería usar una cadena para mantener múltiples valores separados por \0.

+0

La mayoría de las funciones en Lua realmente funcionan más allá de '\ 0'. Al igual que try 'print (s: byte (1, -1))' o 'for b en s: gmatch '.' Do print (b) end'. Supongo que es por eso que la impresión es solo para la depuración rápida: "la impresión no está destinada a la salida formateada, sino solo como una forma rápida de mostrar un valor, generalmente para la depuración" – jpjacobs

+0

@jpjacobs: Vaya. Ha pasado un tiempo desde que hice mucho en Lua. He actualizado mi respuesta. – crashmstr

3

\0 es solo un byte con el valor cero, no necesita ningún nombre de fantasía. Las cadenas Lua son solo cadenas de bytes que realizan un seguimiento de su longitud, por lo que pueden contener valores de bytes, cero incluido. Algunas funciones tratan estas cadenas de bytes como si fueran cadenas de C que terminan con \0, aparentemente print hace esto.

Esto significa que en lua, #s (longitud de cadena) es O (1) frente a O (n) para C strings. Y la aplicación puede usar cadenas lua para cualquier secuencia de bytes, por ejemplo, contenido codificado en UTF-16 de texto o archivos binarios.