С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

base64 - C++

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

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