Форум программистов, компьютерный форум CyberForum.ru

Base64: кодирование и декодирование - C++

Восстановить пароль Регистрация
 
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 16:23     Base64: кодирование и декодирование #1
Источник

Функция кодирования:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const char Base64Table[64] =
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
int __stdcall encode_b64(const unsigned char *buftoenc, int bufsize,
   unsigned char *encbuf)
  {
    // выделяем память под временный буфер
    unsigned char *buftemp = new unsigned char[bufsize + 3];
    memset(buftemp, '\0', bufsize+3);
    memcpy(buftemp, buftoenc, bufsize);
 
    int i = 0;
    int b64byte[5];
 
    while (i < bufsize)
      {
        b64byte[0] = buftemp[i] >> 2;
        b64byte[1] = ((buftemp[i] & 3) << 4)|(buftemp[i + 1] >> 4);
        b64byte[2] = ((buftemp[i + 1] & 0x0F) << 2)|(buftemp[i + 2] >> 6);
        b64byte[3] = buftemp[i + 2] & 0x3F;
        if(b64byte[0] == 0)
          encbuf[i + (i / 3)] = '=';
        else
          encbuf[i + (i / 3)] = Base64Table[b64byte[0]];
 
        if(b64byte[1] == 0)
          encbuf[i + (i / 3) + 1] = '=';
        else
          encbuf[i + (i / 3) + 1] = Base64Table[b64byte[1]];
 
        if(b64byte[2] == 0)
          encbuf[i + (i / 3) + 2] = '=';
        else
          encbuf[i + (i / 3) + 2] = Base64Table[b64byte[2]];
 
        if(b64byte[3] == 0)
          encbuf[i + (i / 3) + 3] = '=';
        else
          encbuf[i + (i / 3) + 3] = Base64Table[b64byte[3]];
        i += 3;
      }
 
    delete buftemp;
    return strlen(encbuf);
  }

Функция декодирования:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const char Base64Table[64] =
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
int __stdcall decode_b64(const unsigned char *buftodec, int bufsize,
  unsigned char *decbuf)
  {
  // выделяем память под временный буфер
  unsigned char *buftemp = new unsigned char [bufsize];
  memset(buftemp, '\0', bufsize);
  memcpy(buftemp, buftodec, bufsize);
 
  int i = 0;
  int cpos[5];
  unsigned char binbyte[4];
 
  while (i < bufsize)
    {
      if(buftemp[i] == '=')
        cpos[0] = 0;
      else
        cpos[0] = strchr(Base64Table, buftemp[i]) - Base64Table;
 
      if(buftemp[i + 1] == '=')
        cpos[1] = 0;
      else
        cpos[1] = strchr(Base64Table, buftemp[i + 1]) - Base64Table;
 
      if(buftemp[i + 2] == '=')
        cpos[2] = 0;
      else
        cpos[2] = strchr(Base64Table, buftemp[i + 2]) - Base64Table;
 
      if(buftemp[i + 3] == '=')
        cpos[3] = 0;
      else
        cpos[3] = strchr(Base64Table,buftemp[i + 3]) - Base64Table;
 
      binbyte[0] = ((cpos[0] << 2) | (cpos[1] >> 4));
      binbyte[1] = ((cpos[1] << 4) | (cpos[2] >> 2));
      binbyte[2] = (((cpos[2] & 0x03 )<< 6) | (cpos[3] & 0x3f));
      decbuf[i - (i / 4)] = binbyte[0];
      decbuf[i - (i / 4) + 1] = binbyte[1];
      decbuf[i - (i / 4) + 2] = binbyte[2];
      i += 4;
    }
 
    delete buftemp;
    return strlen(decbuf);
  }


Хочу переписать на другой язык.

Не совсем понятна строка:
C
1
cpos[0] = strchr(Base64Table, buftemp[i]) - Base64Table
strchr вернёт номер буквы в массиве Base64Table?
Base64Table это же массив, как он может отняться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2659 / 1670 / 156
Регистрация: 13.01.2012
Сообщений: 6,216
24.05.2016, 16:43     Base64: кодирование и декодирование #2
Цитата Сообщение от артист Посмотреть сообщение
Хочу переписать на другой язык.
внезапно... и на какой?
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 17:04  [ТС]     Base64: кодирование и декодирование #3
на павн

1ю функцию получилось без проблем, только тут не понял, просто не вдупляю что такое указатель...
vxg
Модератор
 Аватар для vxg
2659 / 1670 / 156
Регистрация: 13.01.2012
Сообщений: 6,216
24.05.2016, 17:21     Base64: кодирование и декодирование #4
артист, наверное вы ошиблись веткой я вас не понимаю
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 17:37  [ТС]     Base64: кодирование и декодирование #5
Да ничего не ошибся.
Исходник же на си.

Я просто не могу понять эту строку:
C++ (Qt)
1
cpos[0] = strchr(Base64Table, buftemp[i]) - Base64Table
Base64Table - это строка:
C
1
const char Base64Table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
В cpos[0] - запишется какой - то байт.
strchr - вернёт "порядковую цифру" из массива Base64Table в зависимости от буквы в ячейке buftemp[i].
Что вот это значит:
C
1
 - Base64Table
Что это за бред?
Как можно отнять строку от цифры?

Или это типа sizeof строки?

Добавлено через 7 минут
Допустим в зашифрованном виде, в ячейке buftemp[i] была буква "А".

strchr(Base64Table, buftemp[i]) - вернёт 0(ну или 1, откуда там начинаются буквы...)

И теперь от 1 отнимется 65 ?
DarkVortex
102 / 68 / 18
Регистрация: 07.07.2014
Сообщений: 238
24.05.2016, 17:46     Base64: кодирование и декодирование #6
Функция strchr ищет вхождение символа buftemp[i] в строку Base64Table и возвращает его. Затем от этого символа отнимут 'A' на который и ссылается Base64Table. К слову A = 65.
Ваша проблема в том что не знаете что такое char. char != строка.
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 17:50  [ТС]     Base64: кодирование и декодирование #7
Можно это сделать на +х и -сах? Без вхождений(не понимаю что это)...

У меня есть функция contain, возвращает номер символа в строке, или -1 если его нет.

Не работает...
C
1
cpos[0] = contain(Base64Table, buftodec[i]) - sizeof(Base64Table)
DarkVortex
102 / 68 / 18
Регистрация: 07.07.2014
Сообщений: 238
24.05.2016, 17:52     Base64: кодирование и декодирование #8
Цитата Сообщение от артист Посмотреть сообщение
на +х и -сах
Что это?
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 18:05  [ТС]     Base64: кодирование и декодирование #9
Ну без функций, через битсуммы или что - то отнять откуда - то...
vxg
Модератор
 Аватар для vxg
2659 / 1670 / 156
Регистрация: 13.01.2012
Сообщений: 6,216
24.05.2016, 18:11     Base64: кодирование и декодирование #10
артист, вы несёте околёсицу формулируйте яснее
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 18:45  [ТС]     Base64: кодирование и декодирование #11
Как по другому эту операцию сделать?:

C
1
strchr(Base64Table, buftemp[i]) - Base64Table
Без вхождений(каких - то там) и вычета массива.

На пальцах, без функций.

Используя только операторы + - = / | & %...

Не знаю как ещё объяснить...
nmcf
4281 / 3712 / 1247
Регистрация: 14.04.2014
Сообщений: 14,516
24.05.2016, 19:18     Base64: кодирование и декодирование #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
string Base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
cpos[0] = Base64Table.find(buftemp[i]);
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 19:42  [ТС]     Base64: кодирование и декодирование #13
Спасибо, но немного не то...

Вот описание Функция strchr, я всё правильно понял.

Функция просто ищет символ в строке, и возвращает его номер в искомой строке.

Так как можно из цифры вычесть строку?

Вот получается что - то типа этого:
C
1
2
3
const char aaaa[5] = "ABCD";
 
int ololo; ololo = 2 - aaaa
Это что тогда получится?

C
1
ololo[0] = 2 - 5
???
nmcf
4281 / 3712 / 1247
Регистрация: 14.04.2014
Сообщений: 14,516
24.05.2016, 19:45     Base64: кодирование и декодирование #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Арифметика указателей. strchr() возвращает указатель на найденный символ, а не номер. А чтобы получить номер, надо вычесть адрес начала массива, так как массив хранится в непрерывном куске памяти.
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 19:59  [ТС]     Base64: кодирование и декодирование #15
Ааа, это типа оно всё вместе выдаёт номер символа в строке...

C
1
2
3
const char aaaa[5] = "ABCD";
 
int ololo; ololo = strchr(aaaa, 'B') - aaaa
И получается ololo = 2?
nmcf
4281 / 3712 / 1247
Регистрация: 14.04.2014
Сообщений: 14,516
24.05.2016, 20:05     Base64: кодирование и декодирование #16
Нет, 1. Нумерация с нуля.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2016, 20:31     Base64: кодирование и декодирование
Еще ссылки по теме:

Кодирование-декодирование изображений C++
Кодирование и декодирование двоичного файла C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
артист
 Аватар для артист
0 / 2 / 3
Регистрация: 17.09.2014
Сообщений: 549
Завершенные тесты: 1
24.05.2016, 20:31  [ТС]     Base64: кодирование и декодирование #17
Спасибо.
Всё, сделал )) Выкинул половину ненужных массивов...

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
new const g_abc[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
 
stock base64_encode(in[], len, out[])
{   
    new i, j, buf[4]
    
    while(i < len)
    {
        buf[0] = in[i] >> 2
        buf[1] = ((in[i] & 3) << 4)|(in[i + 1] >> 4)
        buf[2] = ((in[i + 1] & 0x0F) << 2)|(in[i + 2] >> 6)
        buf[3] = in[i + 2] & 0x3F
        
        j = -1
        
        while(++j < 4)
        {
            if(!buf[j]) out[i + (i / 3) + j] = '='
            else out[i + (i / 3) + j] = g_abc[buf[j]]
        }
        i += 3
    }
    return strlen(out)
}
 
stock base64_decode(in[], len, out[])
{
    new i, j, buf[4], c[2]
    
    while(i < len)
    {
        j = -1
        
        while(++j < 4)
        {
            if(in[i + j] == '=') buf[j] = '^0'
            else
            {
                formatex(c, charsmax(c), "%c", in[i + j])
                buf[j] = contain(g_abc, c)
            }
        }
        out[i - (i / 4)] = ((buf[0] << 2) | (buf[1] >> 4))
        out[i - (i / 4) + 1] = ((buf[1] << 4) | (buf[2] >> 2))
        out[i - (i / 4) + 2] = (((buf[2] & 0x03 )<< 6) | (buf[3] & 0x3f))
        i += 4
    }
    return strlen(out)
}
Yandex
Объявления
24.05.2016, 20:31     Base64: кодирование и декодирование
Ответ Создать тему
Опции темы

Текущее время: 11:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru