Como fazer xxencode e xxdecode
Para codificar:
- Digite ou cole o texto em Entrada · Texto. O bloco xxencode aparece em Saída · xxencode.
- Defina o Nome do arquivo abaixo da saída com o nome que o destinatário deve receber; o padrão é
data.bin. - Desmarque linhas begin/end se você quer só as linhas de dados.
Para decodificar:
- Clique em xxencode → Texto no seletor de direção.
- Cole o bloco. Qualquer texto antes da linha
begin, como um cabeçalho de e-mail ou uma nota, é ignorado. - Leia o resultado, ajuste Para em Hex para conteúdo binário ou clique em Salvar bytes para baixá-lo com o nome da linha
begin.
Por que o xxencode existe
O alfabeto do uuencode inclui todos os caracteres do espaço (ou da crase) até o _, o que inclui [, ], ^, \ e !. Eles causavam problemas em gateways de e-mail entre sistemas ASCII e EBCDIC, como os mainframes IBM e a rede BITNET, porque esses caracteres não tinham um equivalente único em EBCDIC. Os arquivos chegavam com caracteres trocados e decodificavam em lixo.
O xxencode mantém a estrutura do uuencode e troca o alfabeto por 64 caracteres que se convertem de forma confiável: +, -, 0–9, A–Z e a–z. O valor 0 é +, o valor 1 é -, os dígitos começam no valor 2 e o z minúsculo é 63.
Uuencode e xxencode lado a lado
As mesmas entradas nos dois formatos, com o nome de arquivo hello.txt:
| Entrada | Linha de dados uuencode | Linha de dados xxencode |
|---|---|---|
Cat | #0V%T | 1Eq3o |
Hello, world | ,2&5L;&\L('=O<FQD | AG4JgP4wg65RjQalY |
| 4 bytes zero | $```````` | 2++++++++ |
O primeiro caractere de cada linha é a quantidade de bytes no alfabeto do próprio formato: 3 é # no uuencode e 1 no xxencode, 12 é , e A, 4 é $ e 2. Uma linha cheia de 45 bytes começa com M no uuencode e h no xxencode.
Um arquivo xxencode inteiro tem esta cara, aqui para The quick brown fox jumps over the lazy dog. 0123456789 salvo como fox.txt:
begin 644 fox.txt
hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNmsU
8A12mAnEpBXQsCE++
+
end
O tamanho é igual ao do uuencode: 4 caracteres para cada 3 bytes, mais um caractere de comprimento e uma quebra de linha por linha, cerca de 38% maior que a entrada.
Xxencode em Python
O Python não tem xxencode, mas o binascii.b2a_uu produz os mesmos valores de 6 bits, então traduzir a saída dele do alfabeto uuencode para o alfabeto xxencode gera linhas xxencode corretas, com o caractere de comprimento incluído:
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'
Passe 45 bytes por vez e depois acrescente begin 644 name no topo e + e end no final. Para decodificar, traduza com str.maketrans(XX, UU) e chame binascii.a2b_uu em cada linha. Veja a página de Python para mais sobre bytes e codificações.
Problemas comuns
- Saída sem sentido de um arquivo que deveria estar em xxencode. Confira o primeiro caractere das linhas cheias. Se for
M, o arquivo está em uuencode; use a ferramenta de uuencode. - Uma linha decodifica com o comprimento errado. O caractere de comprimento foi alterado ou perdido, muitas vezes por um cliente de e-mail que quebrou as linhas de novo. O xxencode não consegue recuperar uma linha que foi dividida ou unida.
- O arquivo decodificado sai cortado. O bloco foi publicado em várias partes. Junte-as em ordem, com um único
begine um únicoend, e decodifique o resultado.
Perguntas frequentes
Qual é a diferença entre xxencode e uuencode?
Só o alfabeto. Os dois escrevem 3 bytes como 4 caracteres, em linhas de até 45 bytes com um caractere de comprimento, entre begin e end. O uuencode usa a faixa ASCII da crase e do ! até o _; o xxencode usa +, -, dígitos e letras.
Como saber se um arquivo está em xxencode ou em uuencode?
Olhe o primeiro caractere das linhas de dados cheias: M significa uuencode e h significa xxencode, já que os dois representam 45 bytes. Linhas cheias de pontuação como `, # ou % são uuencode.
Qual programa decodifica arquivos xxencode?
O UUDeview lida com os dois formatos; no Debian e no Ubuntu é o pacote uudeview. O uudecode do GNU sharutils lê uuencode e Base64, mas não xxencode.
Por que um arquivo xxencode termina com uma linha +?
+ é o caractere do xxencode para 0, então uma linha contendo só + é uma linha de dados de comprimento zero. Ela tem o mesmo papel da linha com uma única crase no uuencode, logo antes do end.