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

base64 - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Упорядочьте элементы массива по убыванию модулей элементов http://www.cyberforum.ru/cpp-beginners/thread626743.html
Помогите решать лабораторную работу Упорядочьте элементы массива по убыванию модулей элементов.
C++ Вывод данных из тектового файла Здравствуйте уважаемые эксперты c++. не могли бы мне помочь. на реализации одно из кода. мне понадобилась возможность вывода из файла txt всех данных в программа. те в файле txt написано hello 1 log world программа должна считать всё отуда и вывести на экран. как это можно реализовать? http://www.cyberforum.ru/cpp-beginners/thread626727.html
C++ Продолжение изучения C++
Здравствуйте! Я самостоятельно изучил основы C++ по следующим книгам: Шилдт, базовый курс; Лафоре, ООП в C++; Либерти, 21 день; Страуструп, С++. Читал по порядку. Теперь могу писать простые консольные программы для себя (на физические темы, учусь на физфаке). Есть желание начать проект, не слишком сложный, но чтобы использовать по возможности все полученные знания. У меня три просьбы: 1....
C++ Посоветуйте задачу
Доброго времени суток, уважаемые участники форума. Занимаюсь программированием на C++ уже три года. Не могу сказать, что умею писать код хорошо. Очень далёк от того, что называют "Идеальный кодер". Решил я написать что-нибудь посерьёзнее, задач из задачника. Нет, я не хочу сказать, что справлюсь с любой задачей из задачника сходу. Но я достаточно долго занимался решением таких задач. Нужно...
C++ И снова выбор литературы http://www.cyberforum.ru/cpp-beginners/thread626712.html
На каком-то форуме читал, что книжку лучше всего выбирать такую, чтобы её автором был американец\британец (естественно, обязательно мужчина) и не в коем случае не русский (русская тем более) и что читать лучше всего в оригинале, а не переводе. Правда ли это, или враки госдепа? Ну на примере С++: у меня есть С.Прата "язык программирования С++" (читаю, всё нравится) и Павловская "программирование...
C++ Как сделать чтобы программа не закрывалась. как сделать чтобы программа не закрывалась написон с dev c++ В смысле чтоб программа не можно было вообще закрыт после последнего неправильно написаниа кода, в этом случае код "stop", даже не можно было закрить через X .... #include <iostream> #include <string> using namespace std; int main() { подробнее

Показать сообщение отдельно
nameless
Эксперт C++
333 / 297 / 14
Регистрация: 16.06.2009
Сообщений: 486
23.07.2012, 12:07     base64
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);
}
Вроде бы все интуитивно понятно. Что конкретно не получается?
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru