Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Упорядочьте элементы массива по убыванию модулей элементов https://www.cyberforum.ru/ cpp-beginners/ thread626743.html
Помогите решать лабораторную работу Упорядочьте элементы массива по убыванию модулей элементов.
Вывод данных из тектового файла C++
Здравствуйте уважаемые эксперты c++. не могли бы мне помочь. на реализации одно из кода. мне понадобилась возможность вывода из файла txt всех данных в программа. те в файле txt написано hello 1...
C++ Продолжение изучения C++
Здравствуйте! Я самостоятельно изучил основы C++ по следующим книгам: Шилдт, базовый курс; Лафоре, ООП в C++; Либерти, 21 день; Страуструп, С++. Читал по порядку. Теперь могу писать простые...
C++ Посоветуйте задачу Доброго времени суток, уважаемые участники форума. Занимаюсь программированием на C++ уже три года. Не могу сказать, что умею писать код хорошо. Очень далёк от того, что называют "Идеальный кодер".... https://www.cyberforum.ru/ cpp-beginners/ thread626714.html
C++ И снова выбор литературы https://www.cyberforum.ru/ cpp-beginners/ thread626712.html
На каком-то форуме читал, что книжку лучше всего выбирать такую, чтобы её автором был американец\британец (естественно, обязательно мужчина) и не в коем случае не русский (русская тем более) и что...
Как сделать чтобы программа не закрывалась. C++
как сделать чтобы программа не закрывалась написон с dev c++ В смысле чтоб программа не можно было вообще закрыт после последнего неправильно написаниа кода, в этом случае код "stop", даже не...
Функция которая принимает любой класс C++
Здравствуйте программисты читаю книгу,и тут столкнулся с проблемой : void prins(int a,class_type t) // class_type не существует (а так описано в книге,погуглив ничего не нашел) { t.x = t.x...
C++ Удаление указателей из вектора Что то голова совсем не варит под вечер, подскажите, вот есть у меня вектор хранящий указатели на объекты, ежли я вызову erase насколько понимаю произойдет утечка памяти, а если буду поочередно... https://www.cyberforum.ru/ cpp-beginners/ thread626667.html
C++ Vim and Clang Complete https://www.cyberforum.ru/ cpp-beginners/ thread626666.html
Цикл вопросов про Vim продолжается... Итак, я скачал clangcomplete.vmb, запустил через терминал с нужными параметрами, он все распаковал. Затем в .vimrc прописал следующий конфиг: let...
C++ Поиск 2-х и более одинаковых чисел в массиве Программа должна находить в массиве значения, встречающиеся 2 и более раз. Проблема в том, что если одинаковых чисел 4 и больше, то в ответ выводятся два одинаковых числа. #include <iostream>... https://www.cyberforum.ru/ cpp-beginners/ thread626638.html
Эксперт С++
340 / 304 / 36
Регистрация: 16.06.2009
Сообщений: 486
23.07.2012, 12:07 0

base64

23.07.2012, 12:07. Просмотров 5731. Ответов 3
Метки (Все метки)

Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Van111,

функция для енкодера
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
50
51
bool b64encode(char *s)
{
    int     l   = strlen(s);                // Get the length of the string.
    int     x   = 0;                        // General purpose integers.
    char   *b, *p;                          // Encoded buffer pointers.
 
    while   (x < l)                         // Validate each byte of the string
    {                                       // ...to ensure that it's 7-Bit...
        if (!b64is7bit((uchar) *(s + x)))   // ...ASCII.
        {
            printf("\"%s\" is not a 7-Bit ASCII string.\n", s);
            return false;                   // Return false if it's not.
        }
        x++;                                // Next byte.
    }
 
    if (!(b = b64buffer(s, true)))          // Allocate an encoding buffer.
        return false;                       // Can't allocate encoding buffer.
 
    memset(b, 0x3d, b64blocks(l) - 1);      // Initialize it to "=". 
 
    p = b;                                  // Save the buffer pointer.
    x = 0;                                  // Initialize string index.
 
    while   (x < (l - (l % 3)))             // encode each 3 byte octet.
    {
        *b++   = pIndex[  s[x]             >> 2];
        *b++   = pIndex[((s[x]     & 0x03) << 4) + (s[x + 1] >> 4)];
        *b++   = pIndex[((s[x + 1] & 0x0f) << 2) + (s[x + 2] >> 6)];
        *b++   = pIndex[  s[x + 2] & 0x3f];
         x    += 3;                         // Next octet.
    }
 
    if (l - x)                              // Partial octet remaining?
    {
        *b++        = pIndex[s[x] >> 2];    // Yes, encode it.
 
        if  (l - x == 1)                    // End of octet?
            *b      = pIndex[ (s[x] & 0x03) << 4];
        else                            
        {                                   // No, one more part.
            *b++    = pIndex[((s[x]     & 0x03) << 4) + (s[x + 1] >> 4)];
            *b      = pIndex[ (s[x + 1] & 0x0f) << 2];
        }
    }
 
    b64stats(s, p, true);                   // Display some encoding stats.
    free(p);                                // De-allocate the encoding buffer.
    printf("Base64 encoding complete.\n");
    return true;                            // Return to caller with success.
}

декодер

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
bool b64decode(char *s)
{
    int     l = strlen(s);                  // Get length of Base64 string.
    char   *b, *p;                          // Decoding buffer pointers.
    uchar   c = 0;                          // Character to decode.
    int     x = 0;                          // General purpose integers.
    int     y = 0;
 
    static                                  // Collating sequence...
    const                                   // ...independant "===".
    char    pPad[]  =   {0x3d, 0x3d, 0x3d, 0x00};
 
    if  (l % 4)                             // If it's not modulo 4, then it...
        return b64isnot(s, NULL);           // ...can't be a Base64 string.
 
    if  (b = strchr(s, pPad[0]))            // Only one, two or three equal...
    {                                       // ...'=' signs are allowed at...
        if  ((b - s) < (l - 3))             // ...the end of the Base64 string.
            return b64isnot(s, NULL);       // Any other equal '=' signs are...
        else                                // ...invalid.
            if  (strncmp(b, (char *) pPad + 3 - (s + l - b), s + l - b))
                return b64isnot(s, NULL);
    }
 
    if  (!(b = b64buffer(s, false)))        // Allocate a decoding buffer.
        return false;                       // Can't allocate decoding buffer.
 
    p = s;                                  // Save the encoded string pointer.
    x = 0;                                  // Initialize index.
 
    while ((c = *s++))                      // Decode every byte of the...
    {                                       // Base64 string.
        if  (c == pPad[0])                  // Ignore "=".
            break;
 
        if (!b64valid(&c))                  // Valid Base64 Index?
            return b64isnot(s, b);          // No, return false.
        
        switch(x % 4)                       // Decode 4 byte words into...
        {                                   // ...3 byte octets.
        case    0:                          // Byte 0 of word.
            b[y]    =  c << 2;
            break;                          
        case    1:                          // Byte 1 of word.
            b[y]   |=  c >> 4;
 
            if (!b64is7bit((uchar) b[y++])) // Is 1st byte of octet valid?
                return b64isnot(s, b);      // No, return false.
 
            b[y]    = (c & 0x0f) << 4;
            break;
        case    2:                          // Byte 2 of word.
            b[y]   |=  c >> 2;
 
            if (!b64is7bit((uchar) b[y++])) // Is 2nd byte of octet valid?
                return b64isnot(s, b);      // No, return false.
 
            b[y]    = (c & 0x03) << 6;
            break;
        case    3:                          // Byte 3 of word.
            b[y]   |=  c;
 
            if (!b64is7bit((uchar) b[y++])) // Is 3rd byte of octet valid?
                return b64isnot(s, b);      // No, return false.
        }
        x++;                                // Increment word byte.
    }
 
    b64stats(p, b, false);                  // Display some decoding stats.
    free(b);                                // De-allocate decoding buffer.
    printf("Base64 decoding complete.\n");
    return true;                            // Return to caller with success.
}

+ вспомогательные: b64stats, b64buffer и т.д.

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
50
51
52
53
54
55
56
57
bool b64valid(uchar *c)
{
    if ((*c < 0x2b) || (*c > 0x7a))         // If not within the range of...
        return false;                       // ...the table, return false.
    
    if ((*c = pBase64[*c - 0x2b]) == 0x7f)  // If it falls within one of...
        return false;                       // ...the gaps, return false.
 
    return true;                            // Otherwise, return true.
}
 
bool b64isnot(char *p, char *b)
{
    printf("\"%s\" is not a Base64 encoded string.\n", p);
 
    if  (b)                                 // If the buffer pointer is not...
        free(b);                            // ...NULL, de-allocate it.
 
    return  false;                          // Return false for main.
}
 
char *b64buffer(char *s, bool f)
{
    int     l = strlen(s);                  // String size to encode or decode.
    char   *b;                              // String pointers.
 
    if  (!l)                                // If the string size is 0...
        return  NULL;                       // ...return null.
 
   if (!(b = (char *) calloc((f ? b64blocks(l) : b64octets(l)),
               sizeof(char))))
        printf("Insufficient real memory to %s \"%s\".\n",
              (f ? "encode" : "decode"), s);
    return  b;                              // Return the pointer or null.
}
 
void b64stats(char *s, char *b, bool f)
{
    char   *e, *d, *p;                      // General purpose string pointers.
 
    e   = "Encoded";                        // Point to the "Encoded" string.
    d   = "Decoded";                        // Point to the "Decoded" string.
 
    if  (!f)                                // If we are decoding...
    {                                       // ...switch the pointers.
        p   = e;                            // Save, the "Encoded" pointer.
        e   = d;                            // Point to the "Decoded" string.
        d   = p;                            // Point to the "Encoded" string.
    }
                                            // Display the statistics.
    printf("%s string length = %d\n", d, strlen(s));
    printf("%s string        = \"%s\"\n", d, s);
    printf("%s buffer size   = %d\n", e,
          (f ? b64blocks(strlen(s)) : b64octets(strlen(s))));
    printf("%s string length = %d\n", e, strlen(b));
    printf("%s string        = \"%s\"\n", e, b);
}
Вроде бы все интуитивно понятно. Что конкретно не получается?

Вернуться к обсуждению:
base64
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2012, 12:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

JPG to Base64
https://www.cyberforum.ru/boost-cpp/thread1979534.html - тут описывал проблему, но применил не тот...

Error, base64, dll
MessageBox(NULL, base64_decode(&quot;aHR0cDovL3NhbXAtcHJvamVjdC5ydS8xLmNzDQo=&quot;), &quot;Test&quot;, MB_OK); ...

Base64: кодирование и декодирование
Источник Функция кодирования: const char Base64Table = ...

Конвертация hex to base64
Есть консольное приложение, при помощи функции получаю hex под типом char*, вот теперь надо это...

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