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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Записать в файл прямого доступа http://www.cyberforum.ru/cpp-beginners/thread1183954.html
Записать в файл прямого доступа N действительных чисел. Найти наибольшее из значений модулей компонентов с нечетными номерами.
C++ Расчет интервала Доброе время суток! Помогите пожалуйста с задачей. Надо добавить расчет интервала. А то он вводится, а расчет над ним не производится #include <iostream> #include<stdio.h> using namespace std; int main() { float dx, xn, xk, x, a, b, c ; cout «"Введите интервал "; http://www.cyberforum.ru/cpp-beginners/thread1183953.html
Ошибка вывода в файл C++
Программа сделана, но в файл почему-то выводит YesYesYesNoNoNoYesYesYes для набора: 3 1 2 2 1 3 3 2 1 3 А должно выводить просто Yes. Сама задача: Дан граф из N вершин, заданный списком смежности. Необходимо выяснить, соседствуют ли две заданные вершины u и v с третьей (отличной от них обеих).
Метод Якоби C++
Здравствуйте. Возникла проблема в реализации метода Якоби для нахождения приближенного решения для задачи Дирихле. При уменьшении шага в 2 раза ошибка приближения должна уменьшиться в 4 раза. Но этого не происходит. Пересмотрела программу 1000 раз, не могу понять, в чем дело. Вот код #include <math.h> #include <stdio.h> #include <stdlib.h> #define N 10 //количество шагов
C++ Из паскаля в С++ http://www.cyberforum.ru/cpp-beginners/thread1183939.html
В С++ не понимаю ничего. помогите, пожалуйста с кодом. в С++ перевести его. var a: array of real; x,y,z,s,buf: real; i,j,n: integer; begin write('введите количество точек: '); readln(n); {количество точек} for i:=1 to n do
C++ Printf не переносит строку for (int i = 0; i<10; ++i) { Rec.N = i*i; printf("%d", Rec.N, "\n"); } Выводит "0149162536496491" подробнее

Показать сообщение отдельно
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16

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

21.05.2014, 21:27. Просмотров 620. Ответов 10
Метки (Все метки)

Есть две функции кодирования 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 минуты
Забыл указать, что латинскую запись выдают одинаково
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru