Date: Fri, 12 Jul 1996 02:05:33 -0300
From: Lenimar Nunes de Andrade
Subject: [JAMPA] UUEncode/UUDecode
=================
UUENCODE/UUDECODE
=================
Introducao
----------
Todos ja' perceberam que a rede Internet serve muito bem para
enviar cartas e mensagens para outras pessoas ligadas `a rede.
Dessa forma, fica facil aceitar que qualquer texto possa ser transmi-
tido para qualquer lugar. O que talvez muita gente nao saiba ainda e'
que TUDO o que se tem gravado em disco no micro pode ser codificado
em um texto e, dessa forma, ser enviado via correio eletronico para
qualquer lugar na rede.
Muitos programas hoje em dia permitem o envio, via correio ele-
tronico, de qualquer tipo de arquivo, sem necessidade de codificacao
ou com uma codificacao escondida, a qual o usuario nao precisa nem
tomar conhecimento que exista. Normalmente esse tipo de recurso e'
limitado e nao funciona para todos os sistemas. O procedimento de
codificar o arquivo original em um texto e somente enviar depois de
codificado, e' mais trabalhoso mas tem um alcance muito maior.
Vamos convencionar que um texto e' tudo aquilo que voce possa
digitar normalmente pelo teclado, sem precisar de apelar para teclas
especiais como Alt ou Ctrl. Portanto, um texto e' qualquer conjunto
de letras maiusculas ou minusculas, algarismos, sinais de pontuacao
usuais como parenteses, virgula, ponto, ... com ou sem significado em
qualquer lingua. Um arquivo que nao e' um texto e' chamado de arquivo
binario.
Alem do uuencode ou xxencode, existem muitos outros metodos para
codificar um arquivo binario em um texto. Temos por exemplo o metodo
BTOA (veja o arquivo [7] ), Base64 (tambem conhecido como MIME;
veja o arquivo [6]), entre outros.
Existem programas antigos que codificam qualquer arquivo binario
em um programa em BASIC (veja [5]). Quando o programa em BASIC e'
executado, por exemplo pelo QBASIC, entao o arquivo original e'
recuperado.
Um dos programas mais curiosos que ja' vi e' o COMT.COM (veja a
referencia [8]) que transforma qualquer arquivo .COM em um "texto
executavel". Isto e', o arquivo .COM e' transformado em um texto e
fica funcionando como se nao tivesse acontecido nada.
Bits e bytes
------------
Os sistemas de numeracao geralmente sao ensinados sem maiores
destaques na 6a. serie do 1o. grau. Todos sabem que usamos um sistema
de numeracao de base 10, chamado sistema decimal. Pelo fato da base
ser 10, sao necessarios 10 algarismos (0, 1, ..., 9) para que possa-
mos representar todos os numeros.
Podemos usar um sistema de base qualquer, nao necessariamente
igual a 10. Nao e' novidade que os computadores internamente usam
um sistema de numeracao de base 2, chamado sistema binario. Neste
sistema, so' sao necessarios 2 algarismos: 0 e 1. Combinando-se esses
2 algarismos, tambem e' possivel representar uma infinidade de outras
quantidades: 10, 11, 100, 101, 111, 1000, ... Convencionou-se chamar
esses simbolos 0 e 1 de bits e cada agrupamento de 8 bits de byte.
Com 8 digitos 0 ou 1, consegue-se um total de 256 valores dife-
rentes (256 e' igual a 2 elevado `a oitava potencia). A cada um des-
ses valores atribuiu-se um simbolo. Por exemplo ao 01000001 atribuiu-
-se um "A", ao 01000010 atribuiu-se um "B", ao 01000011 um "C" e
assim por diante. Temos assim construido o que se chama de tabela
ASCII. Voce ja' ouviu falar de codigo Morse? Aquele que representa
qualquer letra com apenas dois simbolos "." e "-" ? Pois bem, a
ideia do codigo Morse e' muito parecida com a ideia da tabela ASCII.
Dependendo do sistema de numeracao escolhido (binario, decimal,
hexadecimal etc.) a tabela ASCII pode ser escrita com outra aparen-
cia. Por exemplo, e' mais comum dizer que o simbolo "A" esta' associ-
ado ao numero 65 (decimal) do que ao numero 01000001 (binario).
O que e' esse tal de 'uuencode'?
--------------------------------
Codificar um arquivo_1 no formato uuencode e' obter um outro
arquivo_2 de tal forma que:
(a) Cada byte do arquivo_2 e' obtido a partir de operacoes arit-
meticas feitas com os bytes do arquivo_1;
(b) Cada byte do arquivo_2 esta' no intervalo [32, 96], ou seja,
ocupa uma posicao da 32a.`a 96a. na tabela ASCII. Assim, todo carac-
ter do arquivo_2 'uuencoded' devera' ser um dos caracteres listados
na seguinte linha:
`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
O algoritmo uuencode, usado no mundo inteiro, e' o seguinte:
(1) Considere um grupo de 3 bytes do arquivo_1 e obtenha suas
representacoes binarias de 8 digitos (bits). Sao obtidos assim um
total de 24 bits;
(2) Separe o grupo de 24 bits em 4 grupos de 6 bits;
(3) Some 32 a cada grupo de 6 bits. O resultado obtido sera'
considerado um byte do arquivo_2 'uuencoded'.
Por exemplo, se o arquivo_1 contiver os caracteres ASCII de nu-
meros 7 (que tem o nome de "beep"), 13 (que e' o "Enter") e 27 (o
"Esc") cujas representacoes binarias sao 00000111 (= 7), 00001101
(= 13) e 00011011 (= 27) dao origem aos 24 bits
000001110000110100011011
que podem ser separados em 4 grupos de 6 bits
000001 110000 110100 011011
que correspondem na notacao decimal a 1, 48, 52 e 27, respectivamen-
te. Somando 32 a cada um desses numeros, obtemos 33, 80, 84 e 59.
Estes serao os bytes do arquivo_2, que correspondem na tabela ASCII
aos caracteres "!", "P", "T" e ";" .
Observe que desse modo, 3 caracteres de controle (beep, Enter e
Esc) se transformam em 4 caracteres "normais", prontos para serem
enviados como se fosse um texto. O receptador do arquivo assim codi-
ficado devera' submeter o texto recebido a um programa decodificador
usualmente chamado 'uudecode' para recuperar o arquivo original.
Alem dos bytes obtidos pela aplicacao do algoritmo acima, costu-
ma-se distribuir os bytes do arquivo codificado em linhas com 61
caracteres. O primeiro caracter de cada linha esta' relacionado com a
quantidade de bytes do arquivo original codificados na linha. Como
para cada 3 bytes do arquivo original temos associado 4 bytes codifi-
cados, e para cada 60 caracteres e' acrescentado mais um no inicio da
linha, podemos concluir que um arquivo no formato uuencode e' aproxi-
madamente 35% maior do que o arquivo original.
O inicio do arquivo no formato uuencode e' identificado com
uma linha que contem a palavra "begin", seguido do modo de permissao
do arquivo (usado somente pelo Unix ou Linux) e o nome original do
arquivo. Depois do ultimo byte codificado, acrescenta-se um "end".
Um algoritmo mais recente, menos utilizado, semelhante ao
uuencode e' o xxencode. A diferenca esta' apenas nos caracteres uti-
lizados. O algoritmo xxencode utiliza a tabua de caracteres
+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
ao inves da tabua de caracteres
`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
usada pelo uuencode.
Exemplos e aplicacoes do uuencode/uudecode
------------------------------------------
Exemplo 1 - A seguir, mostramos um arquivo PROGR.COM no formato
--------- uuencode. Pode ser escrito qualquer mensagem antes
da palavra "begin" ou depois da palavra "end" que
nao vai atrapalhar na decodificacao. No entanto, as linhas entre
o "begin" e o "end" nao devem ser modificadas.
+------ Palavra-chave que sinaliza o inicio da codificacao
|
| +---------- Modo de permissao (usado pelo Unix/Linux)
| |
| | +---- Nome original do arquivo
| | |
v v v
begin 644 progr.com
MZ&4HZ(L!"\!T`^G-`,8&10'_Z'LENWX&B^.[@`8#V(/##[$$T^NT2LTABQX>
M`0O;=$JT2,TA MB_(#-@X!Q@0DS2'&!`"Z*0&T" MZ<0$Z)\`C,B.V([`C19D!(T>5@2X`$O-(0X?P\<&@```#>B``.ES_SQ"=/`\
|----> M1'4%Z-#_Z^<\`'4%Z&D`,L!0#A^`/@"@&,V`O"=`6X+R7-
|----> M(5A0#A^#/A$!`'0ANA,!N`(]S2%R%XO8Q@80`0RZ$`&Y`P"X`T3-(;@`/LTA
| M@SX>`0!T$<0>(`&A)`$FB0>A)@$FB4<"6+1,S2'+H48$CM@N_QY$!,.,R([8
| MCL"X"A;-+PO`=0/IOP`>BQ8(`8X>"@&,V`O"=`JX+R7-(<8&3`'_'\<&"`$`
| M1$`$``````1W=OYF7F8`!$1`!````/YW8G<`!'1`!````/YW9'<"0`0```#^
| )=V1W`G`$```!
| `
| +-> end
| |
| +------------ Palavra-chave que sinaliza o fim da codificacao
|
+--------------- Quase todas as linhas iniciam com um M. Isto
significa que nessas linhas estao codificados
45 bytes do arquivo original (porque o M esta'
na 77a. posicao na tabela ASCII e 77 - 32 = 45)
Exemplo 2 - As 5 primeiras linhas do NETSCAPE.EXE uu-codificado
--------- (uuencoded) sao:
begin 644 netscape.exe
M35I@``$````$`!``__\``/X````2````0```````````````````````````
M````````````````````8````$YO="!A($1/4R!0
To: CCENDM03@BRUFPB
Subject: INDEX.ZIP, Part 1 of 2 (uuencoded)
begin 0600 INDEX.ZIP
M#0H@("`@3F%O(&AA)R!N96-EB!S;VUE;G1E('!A
To: CCENDM03@BRUFPB
Subject: INDEX.ZIP, Part 2 of 2 (uuencoded)
M COPY parte1.uue+parte2.uue total.uue
e depois submeter o arquivo emendado total.uue a um decodificador.
Muitos decodificadores dispensam a trabalhosa retirada dos cabe-
calhos e a emenda das partes fragmentadas. Para isso, normalmente os
decodificadores exigem que cada parte tenha sido recebida em arquivos
de extensoes .001, .002, .003 etc. Neste caso, e' importante que
seja observada uma ordem bastante rigorosa: a primeira parte uu-codi-
ficada deve estar realmente no arquivo de extensao .001, a segunda
parte deve estar no arquivo de extensao .002 e assim por diante. Para
decodificar, basta digitar algo parecido com
C:\> UUDECODE parte.001
Exemplo 4 - Atraves dos servidores de FTP via mail voce pode copiar
--------- muitos arquivos via e-mail. Existem muitos servidores
desses espalhados pelo mundo. Um deles, o da Universidade
de Princeton, tem o nome de Bitftp. Por exemplo, se voce enviar para
o endereco BITFTP@PUCC.PRINCETON.EDU a seguinte mensagem
ftp ftp.simtel.net uuencode
cd /pub/simtelnet
get msdos/arcers/pkz204g.exe
get win95/compress/pkzws201.exe
quit
voce recebera' via e-mail o programa PKZIP em duas versoes, para DOS
e para Windows95. Neste caso, eles virao no formato uuencode e frag-
mentados em muitas partes. Voce nao precisa ficar conectado esperan-
do pela chegada dos arquivos.
Exemplo 5 - Alguns paises como E.U.A., Alemanha e Japao, implantaram
--------- ha' pouco tempo servidores de WWW via e-mail. Atraves
desses servidores, e' possivel copiar via e-mail qualquer
texto ou imagem incorporada `as modernas 'home pages'. Essas imagens
sao enviadas pelos servidores no formato uuencode. Tudo o que voce
precisa saber e' o URL da imagem. Por exemplo, se voce enviar a men-
sagem formada pela seguinte linha
send http://www.paris.org/Musees/Louvre/Treasures/gifs/Mona_Lisa.jpg
para o endereco
agora@info.lanic.utexas.edu
nos E.U.A. ou para o endereco
agora@dna.affrc.go.jp
no Japao, entao voce recebera' um e-mail com uma imagem da Mona Lisa
no formato uuencode. Dai', e' so' salvar a mensagem no disco do seu
micro e submete-la a um programa decodificador (uudecode). A
principal vantagem na utilizacao deste tipo de recurso e' que voce
nao precisa ficar 'on line' esperando pela transferencia da imagem.
Como utilizar o uuencode/uudecode
---------------------------------
A codificacao ou decodificacao de arquivos em geral e' muito
simples. No DOS, basta ter um dos muitos programinhas especificos.
Muitos deles tem ate' o programa fonte em Assembly, C ou Pascal `a
disposicao de quem possa interessar. Um dos programas mais utiliza-
dos e' o [1]. Os [2], [3], [4] tambem parecem ser muito bons.
De um modo geral, a sintaxe e' o nome do programa seguido de um
espaco em branco e do nome do arquivo a ser codificado ou decodifi-
cado. Por exemplo,
C:\> UUENCODE teste.zip
ou
C:\> UUDECODE arquivo.uue
No Unix ou Linux nao ha' necessidade de programa especifico pois
o uuencode/uudecode ja' e' um comando padrao. Por exemplo,
% uuencode arquivo.zip arquivo.zip > arquivo.uue
% uudecode teste.uue
Existem programas uuencode/uudecode para Windows. Veja por
exemplo a referencia [9] a seguir.
As 40 linhas a seguir (que iniciam em XP[@PPD] e terminam com
l6l6l6pp) sao um programa UUDECODE.COM que realmente funciona. Basta
salvar em disco e usa'-lo `a vontade. Nao e' necessario nenhum tipo
de decodificacao.
XP[@PPD]5`P(f#(f((f?5!QP^P_u!2$=po}l=!!rZF*$*$ =0%GF%!!%PP$P$Ps-
%gmZ$rl6lW$rm6mWlVl6m=ldmAlv%fmvmB$Vm6lW$Vm6mWl6m6m=ld%ylVmqlJmq
lRmqlNmqlBlWl6m6l/m'l/m3mWl7m7mrm4mql:lXl7m7mAl2mA%cln%n$[$Z%X$X
l&$_%^$\%`l&%`$Y$Y%[$Y${%k%X$X$Z%X$Xl&$_%^$\%`l&%`$Y$Y%[$Y${%Y$X
%b$Y$Xl&$[%[$Xl&$_%[%X$[$`${%p$[$`l&$[%[$Xl&$_%[%X$[$`${l&%`$V%^
%Y$X%Y${l&%r$a%[$Y$X%^$[%_m&l6l6l6l6l`m5l`m5$dm5l6lBl9m6lB$hm6mW
$dm5lBmNl6m`%t$a%`%Xl