uuencoding es una forma de codificación de binario a texto que se originó en los programas Unix uuencode y uudecode escrito por Mary Ann Horton en UC Berkeley en 1980, [1] para codificar datos binarios para su transmisión en sistemas de correo electrónico.
El nombre "uuencoding" se deriva de "codificación Unix-a-Unix", es decir, la idea de usar una codificación segura para transferir archivos Unix de un sistema Unix a otro sistema Unix pero sin garantía de que los enlaces intermedios serían todos sistemas Unix. Dado que un mensaje de correo electrónico se puede reenviar a través de computadoras con diferentes conjuntos de caracteres o a través de transportes que no son limpios de 8 bits , o manejados por programas que no son limpios de 8 bits, el reenvío de un archivo binario por correo electrónico puede dañarlo. . Al codificar tales datos en un subconjunto de caracteres común a la mayoría de los juegos de caracteres, era poco probable que la forma codificada de tales archivos de datos se "tradujera" o corrompiera y, por lo tanto, llegaría intacta y sin cambios al destino. El programa uudecodeinvierte 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 parte por MIME y yEnc . Con MIME, los archivos que podrían haber sido codificados con uuencoded se transfieren en cambio con codificación base64 .
Formato codificado
Un archivo codificado en uuencoded comienza con una línea de encabezado del formulario:
begin
Cada línea de datos usa el formato:
ácter>
El archivo termina con dos líneas:
`end
La penúltima línea también es un carácter que indica la longitud de la línea con el acento grave que significa cero bytes.
Como archivo completo, la salida con codificación uuen para un archivo de texto sin formato llamado cat.txt que contiene solo los caracteres Cat sería
comenzar 644 cat.txt# 0V% T'final
La línea de inicio es un encabezado uuencode estándar; el '#' indica que su línea codifica tres caracteres; las dos últimas líneas aparecen al final de todos los archivos codificados en uuencoded.
Mecanismo de formateo
El mecanismo de codificación uuen repite lo siguiente para cada 3 bytes, codificándolos en 4 caracteres imprimibles, cada carácter representa un dígito numérico radix-64 :
- Comience con 3 bytes de la fuente, 24 bits en total.
- Dividir en 4 grupos de 6 bits , cada uno representando un valor en el rango de 0 a 63: bits (00-05), (06-11), (12-17) y (18-23).
- Suma 32 a cada uno de los valores. Con la adición de 32 esto significa que los posibles resultados pueden estar entre 32 ("" espacio) y 95 ("_" subrayado ). 96 ("" " acento grave ) ya que 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 de 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 usando el espacio.
- 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 hacerla claramente divisible. Estos bytes se restan del
uudecoding es inverso a lo anterior, reste 32 del código ASCII de cada carácter ( módulo 64 para tener en cuenta el uso de acento grave ) para obtener un valor de 6 bits, concatenar 4 grupos de 6 bits para obtener 24 bits, luego generar 3 bytes.
El proceso de codificación se demuestra en esta tabla, que muestra la derivación de la codificación anterior para "Cat".
Personajes originales | C | a | t | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII original, decimal | 67 | 97 | 116 | |||||||||||||||||||||
ASCII, binario | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
Nuevos valores decimales | dieciséis | 54 | 5 | 52 | ||||||||||||||||||||
+32 | 48 | 86 | 37 | 84 | ||||||||||||||||||||
Caracteres Uuencoded | 0 | V | % | T |
tabla de 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 y carácter de salida de caracteres ASCII correspondientes .
Tenga en cuenta que algunos codificadores pueden producir espacio (código 32) en lugar de acento grave ("` ", código 96), mientras que algunos decodificadores pueden negarse a decodificar datos que contienen espacio.
seis bits | Codigo ascii | Carácter ASCII | seis bits | Codigo ascii | Carácter ASCII | seis bits | Codigo ascii | Carácter ASCII | seis bits | Codigo ascii | Carácter ASCII | seis bits | Codigo ascii | Carácter ASCII | seis bits | Codigo ascii | Carácter ASCII | seis bits | Codigo ascii | Carácter ASCII | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | 96 | ' | 10 | 42 | * | 20 | 52 | 4 | 30 | 62 | > | 40 | 72 | H | 50 | 82 | R | 60 | 92 | \ | ||||||
01 | 33 | ! | 11 | 43 | + | 21 | 53 | 5 | 31 | 63 | ? | 41 | 73 | I | 51 | 83 | S | 61 | 93 | ] | ||||||
02 | 34 | " | 12 | 44 | , | 22 | 54 | 6 | 32 | 64 | @ | 42 | 74 | J | 52 | 84 | T | 62 | 94 | ^ | ||||||
03 | 35 | # | 13 | 45 | - | 23 | 55 | 7 | 33 | sesenta y cinco | A | 43 | 75 | K | 53 | 85 | U | 63 | 95 | _ | ||||||
04 | 36 | PS | 14 | 46 | . | 24 | 56 | 8 | 34 | 66 | B | 44 | 76 | L | 54 | 86 | V | |||||||||
05 | 37 | % | 15 | 47 | / | 25 | 57 | 9 | 35 | 67 | C | 45 | 77 | METRO | 55 | 87 | W | |||||||||
06 | 38 | Y | dieciséis | 48 | 0 | 26 | 58 | : | 36 | 68 | D | 46 | 78 | norte | 56 | 88 | X | |||||||||
07 | 39 | ' | 17 | 49 | 1 | 27 | 59 | ; | 37 | 69 | mi | 47 | 79 | O | 57 | 89 | Y | |||||||||
08 | 40 | ( | 18 | 50 | 2 | 28 | 60 | < | 38 | 70 | F | 48 | 80 | PAG | 58 | 90 | Z | |||||||||
09 | 41 | ) | 19 | 51 | 3 | 29 | 61 | = | 39 | 71 | GRAMO | 49 | 81 | Q | 59 | 91 | [ |
Ejemplo
El siguiente es un ejemplo de codificación uuen de un archivo de texto de una línea. En este ejemplo, % 0D es la representación de bytes para el retorno de carro (CR) y % 0A es la representación de bytes para el avance de línea (LF).
- expediente
Nombre de archivo = wikipedia-url.txtContenido del archivo = http: //www.wikipedia.org%0D%0A
- uuencoding
begin 644 wikipedia-url.txt:: '1T <# HO + W = W = RYW: 6MI <& 5D: 6 $ N; W) G # 0H`'final
Forks (archivo, recurso)
Unix tradicionalmente tiene una única bifurcación donde se almacenan los datos del archivo. Sin embargo, algunos sistemas de archivos admiten múltiples bifurcaciones asociadas con un solo archivo. Por ejemplo, el 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 NTFS de Microsoft Windows . La mayoría de las herramientas uucoding solo manipulan los datos del tenedor de datos primarios que pueden resultar en una pérdida de información al codificar / decodificar (por ejemplo, Windows NTFS comentarios de archivos se guardan en un tenedor diferente.) Algunas herramientas (como la clásica aplicación de Mac OS UUTool ) resolvió el problema al concatenar las diferentes bifurcaciones en un archivo y diferenciarlas por nombre de archivo.
Relación con xxencode, Base64 y Ascii85
A pesar de su rango limitado de caracteres, los datos codificados en uuencoded a veces se corrompen al pasar a través de ciertas computadoras que utilizan conjuntos de caracteres que no son ASCII, como EBCDIC . Un intento de solucionar el problema fue el formato xxencode, que usaba solo caracteres alfanuméricos y los símbolos más y menos. Más común hoy en día es el formato Base64, que se basa en el mismo concepto de alfanumérico, solo que en comparación con ASCII 32–95. Los tres formatos usan 6 bits (64 caracteres diferentes) para representar sus datos de entrada.
Base64 también puede ser generado por el programa uuencode y tiene un formato similar, con la excepción de la traducción de caracteres real:
El encabezado se cambia a
begin-base64
el trailer se convierte en
====
y las líneas entre ellas están codificadas con caracteres elegidos entre
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /
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 solo, aunque esto se puede compensar al menos algo comprimiendo el archivo antes de codificarlo.
Soporte en Python
El lenguaje Python admite la codificación uuen mediante el módulo de códecs con el códec "uu":
Para Python 2 (obsoleto / expirado a partir del 1 de enero de 2020) :
$ python -c 'print "Cat" .encode ("uu")' begin 666 # 0V% TfinalPS
Para Python 3 donde el módulo de códecs debe importarse y usarse directamente :
$ python3 -c "de los códecs importar codificar; imprimir (codificar (b'Cat ',' uu '))" b'begin 666 \ n # 0V% T \ n \ nend \ n' PS
Soporte en 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 'paquete de impresión ("u", "Cat")' # 0V% T
La decodificación de base64 con unpack también se puede lograr traduciendo los caracteres:
$ perl -e ' $ a = "Q2F0" ; $ a = ~ tr # A-Za-z0-9 + / \. \ _ ## cd; # eliminar caracteres que no sean base64 > $ a = ~ tr # A-Za-z0-9 + / # -_ #; # traducir conjuntos > imprimir desempaquetar ("u", paquete ("C", 32 + int (longitud ($ 1) * 6/8)). $ 1) while ($ a = ~ s / (. {60} |. + ) //); ' Gato
Ver también
- Codificación de binario a texto para una comparación de varios algoritmos de codificación
Referencias
- ^ Horton, Mark. "UUENCODE (1C) UNIX Manual del programador" . www.tuhs.org . Consultado el 10 de noviembre de 2020 .
- ^ "fuente uuencode.c" . fossies.org . Consultado el 5 de junio de 2021 .
enlaces externos
- entrada de uuencode en POSIX.1-2008, http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uuencode.html
- GNU-sharutils - suite de código abierto de utilidades 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 de Stuart Cheshire
- UUENCODE-UUDECODE - UUEncoder y UUDecoder en línea gratuitos
- Java UUDecoder : biblioteca Java de código abierto para decodificar archivos adjuntos con codificación uuen (correo)
- AN11229 - Nota de aplicación NXP: Codificación UU para UART ISP