Articulo de referencia

codificación uuen

uuencoding es una forma de codificación de binario a texto que se originó en los programas Unix uuencode y uudecode escritos por Mary Ann Horton en la Universidad de California,...

uuencoding es una forma de codificación de binario a texto que se originó en los programas Unix uuencode y uudecode escritos por Mary Ann Horton en la Universidad de California, Berkeley en 1980, [ 1 ] para codificar datos binarios para su transmisión en sistemas de correo electrónico .

El nombre "uuencoding" deriva de Unix-to-Unix Copy , es decir, "codificación Unix-to-Unix" es una codificación segura para la transferencia de archivos arbitrarios de un sistema Unix a otro, pero sin garantía de que todos los enlaces intermedios sean sistemas Unix. Dado que un mensaje de correo electrónico puede ser reenviado a través de o hacia computadoras con conjuntos de caracteres diferentes o a través de transportes que no son compatibles con 8 bits , o manejado por programas que no son compatibles con 8 bits, reenviar un archivo binario por correo electrónico podría provocar su corrupción. Al codificar dichos datos en un subconjunto de caracteres común a la mayoría de los conjuntos de caracteres, era improbable que la forma codificada de dichos archivos de datos se "tradujera" o corrompiera, y por lo tanto llegaría intacta e inalterada a su destino. El programa uudecode revierte el efecto de uuencode , recreando el archivo binario original con exactitud. uuencode/decode se popularizó para enviar archivos binarios (y especialmente comprimidos) por correo electrónico y publicarlos en grupos de noticias de Usenet , etc.

Actualmente, ha sido reemplazado en gran medida por MIME y yEnc . Con MIME, los archivos que podrían haber sido codificados con uuencode se transfieren con codificación Base64 .

Formato codificado

Un archivo uuencoded comienza con una línea de encabezado con el siguiente formato:

comenzar <modo> <archivo><nueva línea>

<mode>son los permisos de archivo Unix del archivo como tres dígitos octales (por ejemplo, 644, 744). Esto generalmente solo es relevante para sistemas operativos tipo Unix .

<file>es el nombre del archivo que se utilizará al recrear los datos binarios.

<newline>Indica un carácter de nueva línea , utilizado para finalizar cada línea.

Cada línea de datos utiliza el formato:

<longitud de caracteres><caracteres formateados><salto de línea>

<length character>es un carácter que indica la cantidad de bytes de datos codificados en esa línea. Este es un carácter ASCII que se obtiene sumando 32 al número real de bytes, con la única excepción del acento grave "`" (código ASCII 96), que indica cero bytes. Todas las líneas de datos, excepto la última (si la longitud de los datos no es divisible por 45), tienen 45 bytes de datos codificados (60 caracteres después de la codificación). Por lo tanto, la gran mayoría de los valores de longitud son 'M' (32 + 45 = código ASCII 77 o "M").

<formatted characters>son caracteres codificados. Consulte el apartado §  Mecanismo de formato para obtener más detalles sobre la implementación real.

El archivo termina con dos líneas:

`<newline> fin<nueva línea>

La penúltima línea también es un carácter que indica la longitud de la línea, donde el acento grave significa cero bytes.

Como archivo completo, la salida codificada en uuen para un archivo de texto plano llamado cat.txt que contiene solo los caracteres Cat sería

comenzar 644 cat.txt #0V%T ` fin

La línea de inicio es una cabecera uuencode estándar; el símbolo '#' indica que esa línea codifica tres caracteres; las dos últimas líneas aparecen al final de todos los archivos uuencode.

Mecanismo de formato

El mecanismo uuencodingrepite lo siguiente cada 3 bytes, codificándolos en 4 caracteres imprimibles, cada carácter representando un dígito numérico de base 64 :

  1. Comience con 3 bytes de la fuente, 24 bits en total.
  2. Dividido en 4 grupos de 6 bits, cada uno de los cuales representa un valor en el rango de 0 a 63: bits (00-05), (06-11), (12-17) y (18-23).
  3. Suma 32 a cada uno de los valores. Con la suma de 32, esto significa que los resultados posibles pueden estar entre 32 (" " espacio) y 95 (" _ " subrayado ). 96 (" ` " acento grave ) como "carácter especial" es una extensión lógica de este rango. A pesar de que el carácter de espacio está documentado como la codificación para el valor 0, las implementaciones, como GNU sharutils, [ 2 ] en realidad usan el carácter de acento grave para codificar ceros también en el cuerpo del archivo, nunca usando espacio.
  4. Muestra el equivalente ASCII de estos números.

Si la longitud del archivo fuente no es divisible por 3, la última sección de 4 bytes contendrá bytes de relleno para que sea divisible. Estos bytes se restan de la longitud de la línea <length character>para que el decodificador no añada caracteres no deseados al archivo.

uudecodingEs lo contrario de lo anterior, resta 32 del código ASCII de cada carácter ( módulo 64 para tener en cuenta el uso del acento grave) para obtener un valor de 6 bits, concatena 4 grupos de 6 bits para obtener 24 bits y luego genera 3 bytes.

El proceso de codificación se demuestra mediante esta tabla, que muestra la derivación de la codificación anterior para "Gato".

tabla uuencode

La siguiente tabla muestra la conversión del valor decimal de los campos de 6 bits obtenidos durante el proceso de conversión y su correspondiente código y carácter de salida ASCII.

Tenga en cuenta que algunos codificadores pueden producir un espacio (código 32) en lugar de un acento grave ("`", código 96), mientras que algunos decodificadores pueden negarse a decodificar datos que contengan espacios.

Ejemplo

A continuación se muestra un ejemplo de codificación uuen de un archivo de texto de una sola línea. En este ejemplo, %0D es la representación en bytes del retorno de carro y %0A es la representación en bytes del salto de línea .

archivo
Nombre del archivo = wikipedia-url.txt Contenido del archivo = http://www.wikipedia.org%0D%0A
codificación uuen
inicio 644 wikipedia-url.txt ::'1T<#HO+W=W=RYW:6MI<&5D:6$N;W)G#0H` ` fin

Bifurcaciones (archivo, recurso)

Tradicionalmente, Unix tiene una única bifurcación donde se almacenan los datos de los archivos. Sin embargo, algunos sistemas de archivos admiten múltiples bifurcaciones asociadas a un mismo archivo. Por ejemplo, el sistema de archivos jerárquico  (HFS) clásico de Mac OS admitía una bifurcación de datos y una bifurcación de recursos . Mac OS HFS+ admite múltiples bifurcaciones, al igual que los flujos de datos alternativos de Microsoft Windows NTFS . La mayoría de las herramientas de codificación uu solo procesan los datos de la bifurcación de datos principal, lo que puede provocar una pérdida de información al codificar/decodificar (por ejemplo, los comentarios de los archivos de Windows NTFS se guardan en una bifurcación diferente). Algunas herramientas (como la aplicación clásica de Mac OS UUTool ) resolvieron el problema concatenando las diferentes bifurcaciones en un solo archivo y diferenciándolas por su nombre.  

Relación con xxencode, Base64 y Ascii85

A pesar de su limitado rango de caracteres, los datos codificados con uuencode a veces se corrompen al pasar por ciertos ordenadores que utilizan conjuntos de caracteres distintos de ASCII, como EBCDIC . Un intento de solucionar este problema fue el formato xxencode, que solo utilizaba caracteres alfanuméricos y los símbolos de suma y resta. Actualmente, el formato Base64 es más común y se basa en el mismo concepto de solo caracteres alfanuméricos , a diferencia de ASCII 32-95. Los tres formatos utilizan 6  bits (64 caracteres diferentes) para representar los datos de entrada.

Base64 también puede ser generado por el programa uuencode y es similar en formato, excepto por la traducción real de caracteres:

El encabezado se cambia a

begin - base64 <modo> <archivo>

el tráiler se convierte

= = = =

y las líneas intermedias están codificadas con caracteres elegidos de

ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/

Otra alternativa es Ascii85 , que codifica cuatro caracteres binarios en cinco caracteres ASCII. Ascii85 se utiliza en los formatos PostScript y PDF .

Desventajas

uuencoding toma 3 bytes preformateados y los convierte en 4, además de agregar etiquetas de inicio/fin, nombre de archivo y delimitadores . Esto añade al menos un 33 % de sobrecarga de datos en comparación con el archivo original, aunque esto se puede compensar parcialmente comprimiendo el archivo antes de aplicarle uuencoding.

Soporte en idiomas

Pitón

El lenguaje Python admite la codificación uuen utilizando el módulo codecs con el códec "uu":

Para Python 2 (obsoleto/descatalogado a partir del 1 de enero de 2020) :

$ python -c 'print "Cat".encode("uu")' begin 666 <data> # 0V%T end$

Para Python 3 , donde el módulo codecs necesita ser importado y utilizado directamente :

$ python3 -c "from codecs import encode;print(encode(b'Cat', 'uu'))" b'begin 666 <data>\n#0V%T\n \nend\n' $

Para decodificar, pase el archivo completo:

$ python3 -c "from codecs import decode;print(decode(b'begin 666 <data>\n#0V%T\n \nend\n', 'uu'))" b'Cat'

Perl

El lenguaje Perl admite la codificación uuen de forma nativa utilizando los operadores pack() y unpack() con la cadena de formato "u":

$ perl -e 'print pack("u","Cat")' # 0V%T 

Decodificar base64 con unpack también se puede lograr traduciendo los caracteres:

$ perl -e 'print unpack("u","#0V%T")' Cat

Para producir archivos uuencoded bien formados, es necesario usar módulos, [ 3 ] o un poco más de código: [ 4 ]

Codificar (una línea)

$ perl -ple 'BEGIN{use File::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn\n".(pack "u", $_)."`\nend" if $_' /some/file/to_encode.gz 

PHP

El lenguaje PHP tiene una función nativa convert_uuencode():

$ php -r "echo convert_uuencode('Cat');" # 0V%T `

La decodificación se realiza con la función convert_uudecode() correspondiente:

$ php -r "echo convert_uudecode('#0V%T');" Cat

Véase también

Referencias

  1. Horton, Mark. "UUENCODE(1C) UNIX Programmer's Manual" . The Unix Heritage Society . Consultado el 10 de noviembre de 2020 .
  2. "uuencode.c source" . fossies.org . Archivado del original el 5 de junio de 2021. Consultado el 5 de junio de 2021 .
  3. "Fuente de PerlPowerTools" . metacpan.org . Consultado el 12 de febrero de 2024 .
  4. "uuencode.pl source" . main.linuxfocus.org . Consultado el 12 de febrero de 2024 .
  • Entrada uuencode en POSIX.1-2008
  • GNU-sharutils : conjunto de utilidades de código abierto para shar/unshar/uuencode/uudecode.
  • UUDeview : programa de código abierto para codificar/decodificar Base64, BinHex, uuencode, xxencode, etc. para Unix/Windows/DOS.
  • UUENCODE-UUDECODE : programa de código abierto para codificar/decodificar creado por Clem "Grandad" Dye.
  • StUU – UUDecoder rápido de código abierto para Macintosh por Stuart Cheshire
  • UUENCODE-UUDECODE : codificador y decodificador UU en línea gratuitos
  • Java UUDecoder : biblioteca Java de código abierto para decodificar archivos adjuntos (correo electrónico) codificados en UUEN.
  • AN11229 – Nota de aplicación de NXP: Codificación UU para ISP UART