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

base64 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
21.07.2012, 10:57     base64 #1
дай пожалуйста рабочий код кодировщика и декодировщика askii < - > base64
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2012, 10:57     base64
Посмотрите здесь:

C++ Нужен исходник кодирования base64
Как конвертировать файл в base64? C++
конвертация hex to base64 C++
RC4 и Base64 C++
C++ hex vs base64
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
21.07.2012, 11:04     base64 #2
Van111, http://www.marcsweb.com/mnweb_ccppbase64.shtml - здесь посмотрите.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
23.07.2012, 11:53  [ТС]     base64 #3
nameless, помогите пожалуйста выдрать из них енкодер и декодер , у самого пока не получилось
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
23.07.2012, 12:07     base64 #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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);
}
Вроде бы все интуитивно понятно. Что конкретно не получается?
Yandex
Объявления
23.07.2012, 12:07     base64
Ответ Создать тему
Опции темы

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