Страница 1 из 1
Кодировка в BASE64
Добавлено: 30 Март 2006, 8:48
Игорь Столяров
Привет всем !
Не подскажите, есть ли где-нибудь на свете пример кодировки строки в BASE64 и обратно на Clarion ? Сама алгоритмика, вроде бы, не сложная, но использует битовые операции с которыми я работал последний раз - никогда ... ;(
Заранее спасибо за любую подсказку ...

Добавлено: 30 Март 2006, 9:22
Дед Пахом
Давай алгоритм, может, кто что и посоветует
Добавлено: 30 Март 2006, 9:31
Игорь Столяров
Алгоритм BASE64.
Алгоритм предназначен для кодирования последовательностей произвольных байтов в строку из алфавитно-цифровых символов.
Алфавит, используемый для этого, следующий:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Как раз 64 символа. Каждые три байта произвольного потока переводятся в четыре буквы алфавита. Три байта – 24 бита – разбиваются на четыре группы по 6 бит, каждая группа представляет собой двоичное число, значение которого принимается за номер символа из алфавита. Нумерация начинается с нуля. Длина получаемой строки всегда кратна четырем. Если длина исходной последовательности (в битах) не была кратна шести, ее остаток дополняется нулевыми битами до 6, чтобы получить последний номер символа. Сама получаемая строка дополняется в этом случае символами = до длины, кратной четырем. (Интересно, что никогда не приходится при этом добавлять 3 знака =.)
--------------------------------
Усе !
Добавлено: 30 Март 2006, 9:37
Admin
LSZip умеет UUE гонять ...
В Clarion 6 есть файлы ABMIME.INC & .CLW в которых есть класс Base64FileMgr
Вот этот код может чем поможет ...
Код: Выделить всё
ToBase64 PROCEDURE (pFromFile,pToFile,pAppend)
M620 EQUATE(11111100b)
M602 EQUATE(00000011b)
M440 EQUATE(11110000b)
M404 EQUATE(00001111b)
M260 EQUATE(11000000b)
M206 EQUATE(00111111b)
RecLen EQUATE(76)
Code64 STRING('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/')
Temp BYTE
Rest BYTE
Extra BYTE
Count LONG
Posit LONG
CODE
SETCURSOR(CURSOR:Wait)
GL:InputFileName = CLIP(pFromFile)
GL:OutputFileName = CLIP(pToFile)
OPEN(InputDOSFile)
IF ERRORCODE() THEN
SETCURSOR
RETURN 1
END
IF ~pAppend
REMOVE(OutputASCIIFile)
CREATE(OutputASCIIFile)
OPEN(OutputASCIIFile)
IF ERRORCODE() THEN
CLOSE(InputDOSFile)
SETCURSOR
RETURN 2
END
END
CLEAR(Count)
CLEAR(Posit)
SET(InputDOSFile)
LOOP
NEXT(InputDOSFile)
IF ERRORCODE()
CASE Count % 3
OF 1
OUAF:LINE[Posit+1] = Code64[Rest+1]
OUAF:LINE[Posit+2] = '='
OUAF:LINE[Posit+3] = '='
BREAK
OF 2
OUAF:LINE[Posit+1] = Code64[Rest+1]
OUAF:LINE[Posit+2] = '='
BREAK
OF 0
BREAK
END
END
Count += 1
Posit += 1
IF Posit = RecLen+1 THEN Posit = 1.
CASE Count % 3
OF 1
Temp = BAND(INDF:LINE,M620)
Temp = BSHIFT(Temp,-2)
OUAF:LINE[Posit] = Code64[Temp+1]
Rest = BAND(INDF:LINE,M602)
Rest = BSHIFT(Rest,4)
OF 2
Temp = BAND(INDF:LINE,M440)
Temp = BSHIFT(Temp,-4)
Temp = BOR(Temp,Rest)
OUAF:LINE[Posit] = Code64[Temp+1]
Rest = BAND(INDF:LINE,M404)
Rest = BSHIFT(Rest,2)
OF 0
Temp = BAND(INDF:LINE,M260)
Temp = BSHIFT(Temp,-6)
Temp = BOR(Temp,Rest)
OUAF:LINE[Posit] = Code64[Temp+1]
Temp = BAND(INDF:LINE,M206)
Posit += 1
OUAF:LINE[Posit] = Code64[Temp+1]
END
IF ~(Posit % RecLen)
ADD(OutputASCIIFile)
CLEAR(OUAF:LINE)
END
END
ADD(OutputASCIIFile)
CLEAR(OUAF:LINE)
CLOSE(InputDOSFile)
IF ~pAppend
CLOSE(OutputASCIIFile)
END
SETCURSOR
RETURN 0