Декодирование UUE

Обещал в одной из статей сделать декодирование UUE (реализация на Icon), теперь выполняю его…

Утилита консольная: принимает на вход имя файла, в котором хранится uue.

procedure main()
local f,d,s,c,g,kk,xc,zx
#печать строки "Введите путь к декодируемому файлу"
write("Enter a file path:")
#считывание пути
xc:=read()
f:=open(xc,"ru")
#считываем первую строку и вырезаем лишние пробелы,
#выделяем из первой строки декодируемого файла его
#имя и создаем файл с таким именем
d:=!f
zx:=trim(d[11:*d])
g:=open("C:/"||zx,"cwu")
#процесс считывания строк с одновременным декодированием
#строка kk - служит накопительным буфером для байтов файла
kk:=""
while s:=!f do {
        if *s>=4 then {
         c:=s[2:*s]
         if c~=="nd" then kk:=kk||udec(c)
        }
}
write(g,kk)
end
 
# перевод в двоичную систему счисления
procedure to_bin(x)
local r,s,n
n:=x
s:=""
while n>=1 do {
 r:=n%2
 s:=s||r
 n:=integer(n/2)
}
s:=reverse(s)
while *s~=6 do {
  s:="0"||s    
}
return string(s)
end
 
# перевод в десятичную систему счисления
procedure to_dec(d)
local b,i,v
b:=0
v:=reverse(d)
every i:=1 to *d do {
  b:=b+((2^(i-1))*v[i])
}
return b
end
 
#процедура преобразования:выделяем из строки 4 символа,кодируем их в код ASCII
#затем вычитаем 32,преобразуем в бинарный вид,соединяем все в одну строку и
#режем ее на три байта,которые складываем в накопительную переменную,итак
#до окончания исходной строки.
procedure udec(s)
local size,pr,sq,sz,a1,a2,a3,a4,sf
sq:=""
size:=*s
every i:=1 to size by 4 do {
 pr:=s[i+:4]
 a1:=to_bin(ord(pr[1])-32)
 a2:=to_bin(ord(pr[2])-32)
 a3:=to_bin(ord(pr[3])-32)
 a4:=to_bin(ord(pr[4])-32)
 sz:=a1||a2||a3||a4
 sf:=char(to_dec(sz[1+:8]))||char(to_dec(sz[9+:8]))||char(to_dec(sz[17+:8]))
 sq:=sq||sf
}
return sq
sq:=""
end    

 

Добавить комментарий