Cómo codificar con xxencode y decodificar con xxdecode
Para codificar:
- Escribe o pega texto en Entrada · Texto. El bloque xxencode aparece en Salida · xxencode.
- Pon en Nombre de archivo, bajo la salida, el nombre que debe recibir el destinatario; el valor por defecto es
data.bin. - Desmarca líneas begin/end si solo quieres las líneas de datos.
Para decodificar:
- Haz clic en xxencode → Texto en el selector de dirección.
- Pega el bloque. Cualquier texto antes de la línea
begin, como un encabezado de correo o una nota, se ignora. - Lee el resultado, pon A en Hex si el contenido es binario o haz clic en Guardar bytes para descargarlo con el nombre de la línea
begin.
Por qué existe xxencode
El alfabeto de uuencode son todos los caracteres desde el espacio (o el backtick) hasta _, lo que incluye [, ], ^, \ y !. Estos daban problemas en las pasarelas de correo entre sistemas ASCII y EBCDIC, entre ellos los mainframes de IBM y la red BITNET, porque esos caracteres no tenían un único equivalente en EBCDIC. Los archivos llegaban con caracteres cambiados y se decodificaban en basura.
Xxencode mantiene la estructura de uuencode y cambia el alfabeto por 64 caracteres que se convierten de forma fiable: +, -, 0–9, A–Z y a–z. El valor 0 es +, el 1 es -, los dígitos empiezan en el valor 2 y la z minúscula es el 63.
Uuencode y xxencode lado a lado
Las mismas entradas en ambos formatos, con el nombre de archivo hello.txt:
| Entrada | Línea de datos uuencode | Línea de datos xxencode |
|---|---|---|
Cat | #0V%T | 1Eq3o |
Hello, world | ,2&5L;&\L('=O<FQD | AG4JgP4wg65RjQalY |
| 4 bytes a cero | $```````` | 2++++++++ |
El primer carácter de cada línea es el número de bytes en el alfabeto propio del formato: 3 es # en uuencode y 1 en xxencode, 12 es , y A, 4 es $ y 2. Una línea completa de 45 bytes empieza por M en uuencode y por h en xxencode.
Un archivo xxencode completo tiene este aspecto, aquí para The quick brown fox jumps over the lazy dog. 0123456789 guardado como fox.txt:
begin 644 fox.txt
hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNmsU
8A12mAnEpBXQsCE++
+
end
El tamaño es el mismo que con uuencode: 4 caracteres por cada 3 bytes más un carácter de longitud y un salto de línea por línea, alrededor de un 38 % más que la entrada.
Xxencode en Python
Python no tiene xxencode, pero binascii.b2a_uu produce los mismos valores de 6 bits, así que traducir su salida del alfabeto de uuencode al de xxencode da líneas xxencode correctas, carácter de longitud incluido:
import binascii
UU = "`" + "".join(chr(c) for c in range(33, 96))
XX = "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
TO_XX = str.maketrans(UU, XX)
def xxencode_line(chunk: bytes) -> str:
return binascii.b2a_uu(chunk, backtick=True).decode().translate(TO_XX)
xxencode_line(b"Cat") # '1Eq3o\n'
Pásale 45 bytes cada vez y después añade begin 644 name arriba y + y end abajo. Para decodificar, traduce con str.maketrans(XX, UU) y llama a binascii.a2b_uu con cada línea. Consulta la página de Python para más sobre bytes y codificaciones.
Problemas habituales
- Salida sin sentido de un archivo que te dijeron que era xxencode. Mira el primer carácter de las líneas completas. Si es
M, el archivo es uuencode; usa la herramienta de uuencode. - Una línea se decodifica con una longitud incorrecta. El carácter de longitud se cambió o se perdió, a menudo por un cliente de correo que volvió a cortar las líneas. Xxencode no puede recuperar una línea que se dividió o se unió con otra.
- El archivo decodificado está cortado. El bloque se publicó en varias partes. Únelas en orden, con un solo
beginy un soloend, y decodifica el resultado.
Preguntas frecuentes
¿Qué diferencia hay entre xxencode y uuencode?
Solo el alfabeto. Los dos escriben 3 bytes como 4 caracteres en líneas de hasta 45 bytes con un carácter de longitud, entre begin y end. Uuencode usa el rango ASCII que va del backtick y ! hasta _; xxencode usa +, -, dígitos y letras.
¿Cómo sé si un archivo está codificado con xxencode o con uuencode?
Mira el primer carácter de las líneas de datos completas: M significa uuencode y h significa xxencode, porque ambos representan 45 bytes. Las líneas llenas de signos de puntuación como `, # o % son uuencode.
¿Qué programa decodifica archivos xxencode?
UUDeview maneja ambos formatos; en Debian y Ubuntu es el paquete uudeview. El uudecode de GNU sharutils lee uuencode y Base64, pero no xxencode.
¿Por qué un archivo xxencode termina con una línea +?
+ es el carácter de xxencode para el 0, así que una línea que solo contiene + es una línea de datos de longitud cero. Cumple la misma función que la línea con un solo backtick en uuencode, justo antes de end.