Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
#1

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

24.05.2016, 16:23. Просмотров 537. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2016, 16:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Base64: кодирование и декодирование (C++):

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

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

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

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

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

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

16
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
24.05.2016, 16:43 #2
Цитата Сообщение от артист Посмотреть сообщение
Хочу переписать на другой язык.
внезапно... и на какой?
1
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
24.05.2016, 17:04  [ТС] #3
на павн

1ю функцию получилось без проблем, только тут не понял, просто не вдупляю что такое указатель...
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
24.05.2016, 17:21 #4
артист, наверное вы ошиблись веткой я вас не понимаю
1
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
24.05.2016, 17:37  [ТС] #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 ?
0
DarkVortex
103 / 69 / 18
Регистрация: 07.07.2014
Сообщений: 240
24.05.2016, 17:46 #6
Функция strchr ищет вхождение символа buftemp[i] в строку Base64Table и возвращает его. Затем от этого символа отнимут 'A' на который и ссылается Base64Table. К слову A = 65.
Ваша проблема в том что не знаете что такое char. char != строка.
1
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
24.05.2016, 17:50  [ТС] #7
Можно это сделать на +х и -сах? Без вхождений(не понимаю что это)...

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

Не работает...
C
1
cpos[0] = contain(Base64Table, buftodec[i]) - sizeof(Base64Table)
0
DarkVortex
103 / 69 / 18
Регистрация: 07.07.2014
Сообщений: 240
24.05.2016, 17:52 #8
Цитата Сообщение от артист Посмотреть сообщение
на +х и -сах
Что это?
1
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
24.05.2016, 18:05  [ТС] #9
Ну без функций, через битсуммы или что - то отнять откуда - то...
0
vxg
Модератор
3222 / 2025 / 231
Регистрация: 13.01.2012
Сообщений: 7,851
24.05.2016, 18:11 #10
артист, вы несёте околёсицу формулируйте яснее
1
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
24.05.2016, 18:45  [ТС] #11
Как по другому эту операцию сделать?:

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

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

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

Не знаю как ещё объяснить...
0
nmcf
6094 / 5405 / 1888
Регистрация: 14.04.2014
Сообщений: 22,486
24.05.2016, 19:18 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
string Base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
cpos[0] = Base64Table.find(buftemp[i]);
1
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
24.05.2016, 19:42  [ТС] #13
Спасибо, но немного не то...

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

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

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

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

C
1
ololo[0] = 2 - 5
???
0
nmcf
6094 / 5405 / 1888
Регистрация: 14.04.2014
Сообщений: 22,486
24.05.2016, 19:45 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Арифметика указателей. strchr() возвращает указатель на найденный символ, а не номер. А чтобы получить номер, надо вычесть адрес начала массива, так как массив хранится в непрерывном куске памяти.
1
артист
91 / 17 / 5
Регистрация: 17.09.2014
Сообщений: 1,177
Завершенные тесты: 2
24.05.2016, 19:59  [ТС] #15
Ааа, это типа оно всё вместе выдаёт номер символа в строке...

C
1
2
3
const char aaaa[5] = "ABCD";
 
int ololo; ololo = strchr(aaaa, 'B') - aaaa
И получается ololo = 2?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2016, 19:59
Привет! Вот еще темы с ответами:

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

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

base64 - C++
дай пожалуйста рабочий код кодировщика и декодировщика askii &lt; - &gt; base64

RC4 и Base64 - C++
Доброго времени суток, вопрос собственно в следующем. Обязательно ли использовать Base64, когда используешь RC4??? И Если используешь, то...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru