stringtranslate.com

codificación uu

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 .

Formato codificado

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, y 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.

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. Agregue 32 a cada uno de los valores. Con la adición de 32, esto significa que los resultados posibles pueden estar entre 32 (" " espacio) y 95 ("_" subrayado ). 96 ("`" acento grave ) como el "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 en el cuerpo del archivo también, nunca usan espacios.
  4. Genere el equivalente ASCII de estos números.

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.

uudecodinges 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".

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 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.

Ejemplo

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 .

archivo
Nombre del archivo = wikipedia-url.txtContenido del archivo = http://www.wikipedia.org%0D%0A
codificación uu
comienza 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 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.

Relación con xxencode, Base64 y Ascii85

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 .

Desventajas

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.

Soporte en idiomas

Pitón

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' 

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 '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]

Codificar (one line)

$ 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  

Codificar/Decodificar (scripts Perl adecuados)

https://metacpan.org/dist/PerlPowerTools/view/bin/uuencode

https://metacpan.org/dist/PerlPowerTools/view/bin/uudecode

Véase también

Referencias

  1. ^ Horton, Mark. "Manual del programador de UNIX UUENCODE(1C)". The Unix Heritage Society . Consultado el 10 de noviembre de 2020 .
  2. ^ "Fuente de uuencode.c". fossies.org . Consultado el 5 de junio de 2021 .
  3. ^ "Fuente de PerlPowerTools". metacpan.org . Consultado el 12 de febrero de 2024 .
  4. ^ "Fuente uuencode.pl". main.linuxfocus.org . Consultado el 12 de febrero de 2024 .

Enlaces externos