Кодировка в BASE64

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7498
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 18 раз
Поблагодарили: 51 раз

Кодировка в BASE64

Сообщение Игорь Столяров »

Привет всем !

Не подскажите, есть ли где-нибудь на свете пример кодировки строки в BASE64 и обратно на Clarion ? Сама алгоритмика, вроде бы, не сложная, но использует битовые операции с которыми я работал последний раз - никогда ... ;(

Заранее спасибо за любую подсказку ... :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3144
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 32 раза
Контактная информация:

Сообщение Дед Пахом »

Давай алгоритм, может, кто что и посоветует
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7498
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 18 раз
Поблагодарили: 51 раз

Сообщение Игорь Столяров »

Алгоритм BASE64.

Алгоритм предназначен для кодирования последовательностей произвольных байтов в строку из алфавитно-цифровых символов.

Алфавит, используемый для этого, следующий:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Как раз 64 символа. Каждые три байта произвольного потока переводятся в четыре буквы алфавита. Три байта – 24 бита – разбиваются на четыре группы по 6 бит, каждая группа представляет собой двоичное число, значение которого принимается за номер символа из алфавита. Нумерация начинается с нуля. Длина получаемой строки всегда кратна четырем. Если длина исходной последовательности (в битах) не была кратна шести, ее остаток дополняется нулевыми битами до 6, чтобы получить последний номер символа. Сама получаемая строка дополняется в этом случае символами = до длины, кратной четырем. (Интересно, что никогда не приходится при этом добавлять 3 знака =.)

--------------------------------
Усе !
Аватара пользователя
Admin
Администратор
Сообщения: 3963
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 29 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение 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
Ответить