Обещал в одной из статей сделать декодирование 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