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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Дана строка, содержащая текст. Найти слова, в которых буквы расположены по алфавиту http://www.cyberforum.ru/cpp-beginners/thread1744151.html
Задание 11. Дана строка, содержащая текст. Найти слова, в которых буквы расположены по алфавиту. (Например: Abefz) Вот допустим объявил строку char s="abcdef fadfeqerf fadf q fqefq fqfqfsdffda"; Препод говорит используй функцию разбора строки на лексемы, вот такую билеберду написал, думать честно говоря дальше лень #include<iostream.h> #include<string.h> #include<conio.h>...
C++ Создать стэк и замкнуть в кольцо создать стэк и замкнуть в кольцо, с++ builder в оконном приложении http://www.cyberforum.ru/cpp-beginners/thread1744147.html
Возврат по ссылке C++
Вычитал давно еще, что если возвращать статический обьект из метода и присвоить его констатной ссылке то он продолжить жить пока видима эта ссылка. Что не так в коде? Выводит лишь первую строку двумерного массива. Если убрать ссылку, и делать по значению, все фурычит. QVector<QVector<QString> >& querySelect(QString query_string) { QVector<QVector<QString> > result; // changes... ...
Задержка командной строки C++
При нажатии кнопки на форме Билдера открывается командная строка, пингует айпишник и тут же закрывается. Как мне ее задержать, чтобы я успел посмотреть результат? system("pause") не подходит
C++ Игнорирование пробелов при считывание http://www.cyberforum.ru/cpp-beginners/thread1744119.html
Здравствуйте, друзья. передо мной стоит задача проверить, является ли строка палиндромом. я предложил вот такую реализацию. #include <iostream> #include <stdlib.h> #include <cstring> using namespace std; bool compare(char a, char b)
C++ По номеру строки в тексте определить номер страницы В книге на одной странице помещается k строк. Таким образом, на 1-й странице печатаются строки с 1-й по k-ю, на второй — с (k+1)-й по (2k)-ю и т. д. Напишите программу, по номеру строки в тексте определяющую номер страницы, на которой будет напечатана эта строка, и порядковый номер этой строки на странице. Входные данные На вход программе подаются число k — количество строк на странице и... подробнее

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

Функция кодирования:
Кликните здесь для просмотра всего текста
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 это же массив, как он может отняться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru