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" se 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 sistema Unix pero sin garantía de que los enlaces intermedios sean todos sistemas Unix. Dado que un mensaje de correo electrónico puede ser reenviado a través de o hacia computadoras con diferentes conjuntos de caracteres o a través de transportes que no son de 8 bits limpios , o manejados por programas que no son de 8 bits limpios, reenviar un archivo binario por correo electrónico puede causar que se corrompa. Al codificar dichos datos en un subconjunto de caracteres común a la mayoría de los conjuntos de caracteres, era poco probable que la forma codificada de dichos archivos de datos se "tradujera" o corrompiera, y por lo tanto llegaría intacta y sin cambios al destino. El programa uudecode revierte el efecto de uuencode , recreando exactamente el archivo binario original. uuencode/decode se hizo popular para enviar archivos binarios (y especialmente comprimidos) por correo electrónico y publicarlos en grupos de noticias de Usenet , etc.
Ahora ha sido reemplazado en gran medida por MIME y yEnc . Con MIME, los archivos que podrían haber sido codificados con uuencode se transfieren en su lugar con codificación Base64 .
Un archivo uuencoded comienza con una línea de encabezado con el formato:
comenzar <modo> <archivo><nueva línea>
<mode>
son los permisos de archivo Unix del archivo en forma de tres dígitos octales (por ejemplo, 644, 744). Esto normalmente solo es importante para sistemas operativos tipo Unix .
<file>
es el nombre del archivo que se utilizará al recrear los datos binarios.
<newline>
significa un carácter de nueva línea , utilizado para terminar cada línea.
Cada línea de datos utiliza el formato:
<carácter de longitud><caracteres formateados><nueva línea>
<length character>
es un carácter que indica el número de bytes de datos que se han codificado en esa línea. Se trata de un carácter ASCII que se determina sumando 32 al número real de bytes, con la única excepción de un acento grave "`" (código ASCII 96) que significa cero bytes. Todas las líneas de datos, excepto la última (si la longitud de los datos no era 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 § Mecanismo de formato para obtener más detalles sobre la implementación real.
El archivo termina con dos líneas:
`<nueva línea>fin<nueva línea>
La segunda línea antes de la última 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 uuencoded para un archivo de texto simple llamado cat.txt que contiene solo los caracteres Cat sería
comienza 644 cat.txt#0V%T`fin
La línea de inicio es un encabezado uuencode estándar; el '#' indica que su línea codifica tres caracteres; las últimas dos líneas aparecen al final de todos los archivos uuencode.
El mecanismo uuencoding
repite lo siguiente cada 3 bytes, codificándolos en 4 caracteres imprimibles, cada carácter representando un dígito numérico de base 64 :
Si la longitud de la fuente no es divisible por 3, la última sección de 4 bytes contendrá bytes de relleno para que sea perfectamente divisible. Estos bytes se restan de la línea <length character>
para que el decodificador no añada caracteres no deseados al archivo.
uudecoding
es lo inverso 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 en esta tabla, que muestra la derivación de la codificación anterior para "Gato".
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 código de salida y carácter ASCII correspondiente.
Tenga en cuenta que algunos codificadores pueden producir espacios (código 32) en lugar de acento grave ("`", código 96), mientras que algunos decodificadores pueden negarse a decodificar datos que contengan espacios.
El siguiente es un ejemplo de codificación uuencoding de un archivo de texto de una 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 avance de línea .
Nombre del archivo = wikipedia-url.txtContenido del archivo = http://www.wikipedia.org%0D%0A
comienza 644 wikipedia-url.txt::'1T<#HO+W=W=RYW:6MI<&5D:6$N;W)G#0H``fin
Tradicionalmente, Unix tiene una única bifurcación donde se almacenan los datos de los archivos. Sin embargo, algunos sistemas de archivos admiten varias bifurcaciones asociadas a un único 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 varias bifurcaciones, al igual que los flujos de datos alternativos de Microsoft Windows NTFS . La mayoría de las herramientas de uucoding solo manejarán 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 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 archivo y diferenciándolas por nombre de archivo.
A pesar de su gama limitada de caracteres, los datos codificados en uuencode a veces se corrompen al pasar por ciertas computadoras que usan conjuntos de caracteres no ASCII, como EBCDIC . Un intento de resolver el problema fue el formato xxencode, que usaba solo caracteres alfanuméricos y los símbolos más y menos. Hoy en día, 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 usan 6 bits (64 caracteres diferentes) para representar sus datos de entrada.
Base64 también puede generarse mediante 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 trailer se convierte en
====
y las líneas entre ellas están codificadas con caracteres elegidos entre
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefmaterial de archivowxyz0123456789+/
Otra alternativa es Ascii85 , que codifica cuatro caracteres binarios en cinco caracteres ASCII. Ascii85 se utiliza en formatos PostScript y PDF .
uuencoding toma 3 bytes preformateados y los convierte en 4, y también agrega etiquetas de inicio/fin, nombre de archivo y delimitadores . Esto agrega al menos un 33 % de sobrecarga de datos en comparación con la fuente sola, aunque esto se puede compensar al menos en parte comprimiendo el archivo antes de codificarlo con uuencoding.
El lenguaje Python admite la codificación uu mediante el módulo de códecs con el códec "uu":
Para Python 2 (obsoleto/descontinuado a partir del 1 de enero de 2020) :
$ python -c 'print "Cat".encode("uu")' begin 666 <datos> # 0V%T end $
Para Python 3 , donde el módulo de códecs debe importarse y usarse directamente :
$ python3 -c "de codecs importar encode;print(encode(b'Cat', 'uu'))" b'begin 666 <datos>\n#0V%T\n \nend\n' $
Para decodificar, pase el archivo completo:
$ python3 -c "de codecs importar decodificar;print(decodificar(b'begin 666 <data>\n#0V%T\n \nend\n', 'uu'))" b'Gato'
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 'imprimir paquete("u","Gato")' # 0V%T
La decodificación de base64 con unpack también se puede lograr traduciendo los caracteres:
$ perl -e 'print unpack("u",#0V%T")' Gato
Para producir archivos uuencoded bien formados, necesitas usar módulos, [3] o un poco más de código: [4]
$ perl -ple 'BEGIN{use File::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn\n".(pack "u", $_)."`\nend" if $_' /algún/archivo/a_codificar.gz
https://metacpan.org/dist/PerlPowerTools/view/bin/uuencode
https://metacpan.org/dist/PerlPowerTools/view/bin/uudecode