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

Base64 не работает с кириллицей в одном из случаев - C++

Восстановить пароль Регистрация
 
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
21.05.2014, 21:27     Base64 не работает с кириллицей в одном из случаев #1
Есть две функции кодирования Bаse64 в разных кодировках.
Например фраза "Василий Иванович" в первой функции выглядит так: wuDx6Ovo6SDI4uDt7uLo9wA= (проверить можно тут http://base64online.org/decode/)
Во второй должно быть так: 0JLQsNGB0LjQu9C40Lkg0JjQstCw0L3QvtCy0LjRhw== (проверить тут http://base64online.org/decode/ или тут http://crypt-online.narod.ru/crypts/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
const char base64_map[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
void CProcessor::Encrypt(const char * srcp, int len, char * dstp)
    {  
        register int i = 0;
        char *dst = dstp;
 
        for (i = 0; i < len - 2; i += 3)
        {
            *dstp++ = *(base64_map + ((*(srcp+i)>>2)&0x3f));
            *dstp++ = *(base64_map + ((*(srcp+i)<< 4)&0x30 | (
                                *(srcp+i+1)>>4)&0x0f ));
            *dstp++ = *(base64_map + ((*(srcp+i+1)<<2)&0x3C | (
                                *(srcp+i+2)>>6)&0x03));
            *dstp++ = *(base64_map + (*(srcp+i+2)&0x3f));
        }
        srcp += i;
        len -= i;
 
        if(len & 0x02 ) /* (i==2) 2 bytes left,pad one byte of '=' */
        {      
            *dstp++ = *(base64_map + ((*srcp>>2)&0x3f));
            *dstp++ = *(base64_map + ((*srcp<< 4)&0x30 | (
                                *(srcp+1)>>4)&0x0f ));
            *dstp++ = *(base64_map + ((*(srcp+1)<<2)&0x3C) );
            *dstp++ = '=';
        }
        else if(len & 0x01 )  /* (i==1) 1 byte left,pad two bytes of '='  */
        { 
            *dstp++ = *(base64_map + ((*srcp>>2)&0x3f));
            *dstp++ = *(base64_map + ((*srcp<< 4)&0x30));
            *dstp++ = '=';
            *dstp++ = '=';
        }
 
    //  *dstp = '\0';
 
    }
вторая (не работает с киррилицей, но подходит по условию задачи):
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
void base64_encode(char *out, char *data, unsigned int len) 
{  
  
   char *base64_set = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
   unsigned char index2,index3;
   int i=0;
   for(; i<len; (i+=3,data+=3,out+=4)) 
   { 
      *out = base64_set[*data >> 2];     
      index2 = (*data << 4) & 0x30;
      if(i+2<len) 
      {         
         index2 |= *(data+1) >> 4;        
         index3 = ((*(data+1) << 4) & 0xFF) >> 2;
         if(i+3<len) 
         {            
            index3 |= *(data+2) >> 6;            
            *(out + 3) = base64_set[*(data+2) & 0x3F];
         } 
         else 
         {           
            *(out + 3) = '=';
         }
         *(out + 2) = base64_set[index3];
      } 
      else 
      {
         *(out + 2) = '=';
         *(out + 3) = '=';
      }
      *(out + 1) = base64_set[index2];
   }
   *out = 0;
}

Никак не могу заставить работать с кириллицей вторую функцию, весь инет перерыл.
Для моего проекта недопустимо использование setlocale(0,""); Не спрашивайте, просто это так.

Добавлено через 22 минуты
Забыл указать, что латинскую запись выдают одинаково
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,153
21.05.2014, 22:29     Base64 не работает с кириллицей в одном из случаев #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Замените везде char* на unsigned char*.

Добавлено через 4 минуты
PS. Указанный вами результат соответствует кодировке исходной строки utf-8.
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
21.05.2014, 23:45  [ТС]     Base64 не работает с кириллицей в одном из случаев #3
"PS. Указанный вами результат соответствует кодировке исходной строки utf-8."
- какой именно первый или второй? Кстати пробовал кириллицу перевести в utf-8 - не вышло.

Сейчас поробую заменить везде char* на unsigned char*.

Добавлено через 27 минут
ругается на эту строчку:
C++
1
unsigned char *base64_set = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

error C2440: 'initializing' : cannot convert from 'char [65]' to 'unsigned char *'
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2014, 23:56     Base64 не работает с кириллицей в одном из случаев #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
unsigned char *base64_set = (unsigned char*)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
22.05.2014, 01:15  [ТС]     Base64 не работает с кириллицей в одном из случаев #5
как корректно перевести char* в unsigned char*, а потом обратно?
есть функция reinterpret_cast, но не понятно как ей безопасно пользоваться.

Добавлено через 54 минуты
также неявно преобразовал (unsigned char*) везде. Заработало. Но совершенно не так, как я ожидал. Выдает тот же результат, что и первая.
Странно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2014, 01:20     Base64 не работает с кириллицей в одном из случаев #6
Цитата Сообщение от Torument Посмотреть сообщение
также неявно преобразовал (unsigned char*) везде.
Это, как раз, явно.
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
22.05.2014, 02:57  [ТС]     Base64 не работает с кириллицей в одном из случаев #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Это, как раз, явно.
Верно, надо выспасться)))

По Base64 - пока не удолось получить нужную строку. Придется глубже изучить кодировки.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2014, 06:31     Base64 не работает с кириллицей в одном из случаев #8
Цитата Сообщение от Torument Посмотреть сообщение
но не подходит по условию задачи
По какому?
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,153
22.05.2014, 07:22     Base64 не работает с кириллицей в одном из случаев #9
Цитата Сообщение от Torument Посмотреть сообщение
По Base64 - пока не удолось получить нужную строку. Придется глубже изучить кодировки.
ВАША вторая программа с ВАШИМИ входными данными (в кодировке uft-8) в результате выдала приведенную ВАМИ вторую строку, о чем я уже уже писал.
Цитата Сообщение от Torument Посмотреть сообщение
Сейчас поробую заменить везде char* на unsigned char*
По меньшей мере, в data это необходимо, иначе вычисления будут неверными. base64_set могли бы и оставить.

Добавлено через 45 минут
Первый результат
wuDx6Ovo6SDI4uDt7uLo9w==
выдает эта же программа при исходной строке в кодировке cp1251.
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
22.05.2014, 13:04  [ТС]     Base64 не работает с кириллицей в одном из случаев #10
Цитата Сообщение от gng Посмотреть сообщение
ВАША вторая программа с ВАШИМИ входными данными (в кодировке uft-8) в результате выдала приведенную ВАМИ вторую строку, о чем я уже уже писал.
Теперь понятно, что вы имели в виду. Я попробую передать в UTF-8

Цитата Сообщение от gng Посмотреть сообщение
По меньшей мере, в data это необходимо, иначе вычисления будут неверными. base64_set могли бы и оставить.
ранее не приходилось использовать unsigned char. Теперь стало ясно почему функция работала именно таким образом.

Цитата Сообщение от gng Посмотреть сообщение
Первый результат
wuDx6Ovo6SDI4uDt7uLo9w==
выдает эта же программа при исходной строке в кодировке cp1251.
Это я тоже вчера выяснил. Как только заменил на unsigned char*. И тут мне стало ясно, что функции работают одинаково. Одинаково правильно. И имеет значение в какой кодировке приходят к ней данные, а не реализация алгоритма.

Цитата Сообщение от alsav22 Посмотреть сообщение
но не подходит по условию задачи
По какому?
Хотел получить фразу "Василий Иванович" не wuDx6Ovo6SDI4uDt7uLo9wA= (в первой функции)
А так: 0JLQsNGB0LjQu9C40Lkg0JjQstCw0L3QvtCy0LjRhw== (мне казалось, что вторая функция так сможет, так как я тоже давал ей cp1251 и она "падала", если встречалась кириллица).

Всем огромное спасибо. Вопрос решен, с проблемой разобрался.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 22:11     Base64 не работает с кириллицей в одном из случаев
Еще ссылки по теме:

C++ Шифрование текста алгоритмом Виженера не работает с кириллицей
Программа работает не для всех случаев C++

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

Или воспользуйтесь поиском по форуму:
0makc
0 / 0 / 0
Регистрация: 26.06.2014
Сообщений: 9
26.06.2014, 22:11     Base64 не работает с кириллицей в одном из случаев #11
у меня не base64, но проблема та же и никак не могу решить. Функция XOR возвращает
при исходной строке "съешь еще этих мягких мексиканских кактусов да выпей текилы":
"?????N???p????N??????G????????????E????????E??L?????E??????@"

то есть не хочет читать кириллицу:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void XOR(char* lpPassword, unsigned char* lpResult)
{
    if(lpPassword[0]=='\0' || strlen(lpPassword)<=0) return;
    unsigned int i = 0, j = 0,lenth=strlen(lpPassword);    
    while (lpResult[i]!='\0')
    {  
        lpResult[i] ^= lpPassword[j];
    j++;
    if (j>lenth-1) 
        {
       j = 0;
        }       
        i++;        
    }
}
Должно быть что-то в роде: БЦрЯХNѾЬьpСзџЬNѷЪъѪєаGѕћѱФсѪќшЦѓіЎEуѠізФШѐѹEэѠLчЬіћѲEлѥіэќТ
Yandex
Объявления
26.06.2014, 22:11     Base64 не работает с кириллицей в одном из случаев
Ответ Создать тему
Опции темы

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