Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611

Base64: кодирование и декодирование

24.05.2016, 16:23. Показов 10020. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Источник

Функция кодирования:
Кликните здесь для просмотра всего текста
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 это же массив, как он может отняться?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2016, 16:23
Ответы с готовыми решениями:

Кодирование и декодирование
Всем привет. Народ,у меня такая проблема, есть код который кодирует и декодирует текст. Но вот проблемка, если закомментировать все функции...

Кодирование и декодирование QR кода
Люди, помогите! У меня сложное задание по курсовой и я не знаю что делать. Вот такое задание &quot;работа с QR кодами(кодирование и...

Кодирование-декодирование изображений
Нужна программа с++, которая кодирует изображение в изображение(и обратно), используя при этом 2 младших бита. Есть программа, которая...

16
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.05.2016, 16:43
Цитата Сообщение от артист Посмотреть сообщение
Хочу переписать на другой язык.
внезапно... и на какой?
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 17:04  [ТС]
на павн

1ю функцию получилось без проблем, только тут не понял, просто не вдупляю что такое указатель...
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.05.2016, 17:21
артист, наверное вы ошиблись веткой я вас не понимаю
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 17:37  [ТС]
Да ничего не ошибся.
Исходник же на си.

Я просто не могу понять эту строку:
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 ?
0
103 / 69 / 19
Регистрация: 07.07.2014
Сообщений: 240
24.05.2016, 17:46
Функция strchr ищет вхождение символа buftemp[i] в строку Base64Table и возвращает его. Затем от этого символа отнимут 'A' на который и ссылается Base64Table. К слову A = 65.
Ваша проблема в том что не знаете что такое char. char != строка.
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 17:50  [ТС]
Можно это сделать на +х и -сах? Без вхождений(не понимаю что это)...

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

Не работает...
C
1
cpos[0] = contain(Base64Table, buftodec[i]) - sizeof(Base64Table)
0
103 / 69 / 19
Регистрация: 07.07.2014
Сообщений: 240
24.05.2016, 17:52
Цитата Сообщение от артист Посмотреть сообщение
на +х и -сах
Что это?
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 18:05  [ТС]
Ну без функций, через битсуммы или что - то отнять откуда - то...
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
24.05.2016, 18:11
артист, вы несёте околёсицу формулируйте яснее
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 18:45  [ТС]
Как по другому эту операцию сделать?:

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

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

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

Не знаю как ещё объяснить...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.05.2016, 19:18
Лучший ответ Сообщение было отмечено артист как решение

Решение

C++
1
2
string Base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
cpos[0] = Base64Table.find(buftemp[i]);
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 19:42  [ТС]
Спасибо, но немного не то...

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

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

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

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

C
1
ololo[0] = 2 - 5
???
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.05.2016, 19:45
Лучший ответ Сообщение было отмечено артист как решение

Решение

Арифметика указателей. strchr() возвращает указатель на найденный символ, а не номер. А чтобы получить номер, надо вычесть адрес начала массива, так как массив хранится в непрерывном куске памяти.
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 19:59  [ТС]
Ааа, это типа оно всё вместе выдаёт номер символа в строке...

C
1
2
3
const char aaaa[5] = "ABCD";
 
int ololo; ololo = strchr(aaaa, 'B') - aaaa
И получается ololo = 2?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.05.2016, 20:05
Нет, 1. Нумерация с нуля.
0
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,611
24.05.2016, 20:31  [ТС]
Спасибо.
Всё, сделал )) Выкинул половину ненужных массивов...

Кликните здесь для просмотра всего текста
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)
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.05.2016, 20:31
Помогаю со студенческими работами здесь

Кодирование/Декодирование текста
Создать приложение с графическим интерфейсом в любой визуальной среде разработки, выполняющее следующие действия: 1) Пользователь...

Кодирование и декодирование двоичного файла
Кодирование и декодирование двоичного файла путем сложения каждого байта по модулю два с заданным пользователем числом. Если можно код! ...

Кодирование и декодирование методом Голея
Ребята,помогите,нужна программка которая будет кодировать и декодировать информацию методом Голея(23,12,7)

Кодирование и декодирование методом байтового гаммирования
Что это такое и как его реализовать? Добавлено через 46 минут -up Добавлено через 5 часов 36 минут -up

Составить программу реализующую кодирование и декодирование c++
Составить программу реализующую кодирование и декодирование c++


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru