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