Привет всем !
Не подскажите, есть ли где-нибудь на свете пример кодировки строки в BASE64 и обратно на Clarion ? Сама алгоритмика, вроде бы, не сложная, но использует битовые операции с которыми я работал последний раз - никогда ... ;(
Заранее спасибо за любую подсказку ...
Кодировка в BASE64
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7498
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 18 раз
- Поблагодарили: 51 раз
- Игорь Столяров
- Ветеран движения
- Сообщения: 7498
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 18 раз
- Поблагодарили: 51 раз
Алгоритм BASE64.
Алгоритм предназначен для кодирования последовательностей произвольных байтов в строку из алфавитно-цифровых символов.
Алфавит, используемый для этого, следующий:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Как раз 64 символа. Каждые три байта произвольного потока переводятся в четыре буквы алфавита. Три байта – 24 бита – разбиваются на четыре группы по 6 бит, каждая группа представляет собой двоичное число, значение которого принимается за номер символа из алфавита. Нумерация начинается с нуля. Длина получаемой строки всегда кратна четырем. Если длина исходной последовательности (в битах) не была кратна шести, ее остаток дополняется нулевыми битами до 6, чтобы получить последний номер символа. Сама получаемая строка дополняется в этом случае символами = до длины, кратной четырем. (Интересно, что никогда не приходится при этом добавлять 3 знака =.)
--------------------------------
Усе !
Алгоритм предназначен для кодирования последовательностей произвольных байтов в строку из алфавитно-цифровых символов.
Алфавит, используемый для этого, следующий:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Как раз 64 символа. Каждые три байта произвольного потока переводятся в четыре буквы алфавита. Три байта – 24 бита – разбиваются на четыре группы по 6 бит, каждая группа представляет собой двоичное число, значение которого принимается за номер символа из алфавита. Нумерация начинается с нуля. Длина получаемой строки всегда кратна четырем. Если длина исходной последовательности (в битах) не была кратна шести, ее остаток дополняется нулевыми битами до 6, чтобы получить последний номер символа. Сама получаемая строка дополняется в этом случае символами = до длины, кратной четырем. (Интересно, что никогда не приходится при этом добавлять 3 знака =.)
--------------------------------
Усе !
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
LSZip умеет UUE гонять ...
В Clarion 6 есть файлы ABMIME.INC & .CLW в которых есть класс Base64FileMgr
Вот этот код может чем поможет ...
В 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