Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 08.05.2011
Сообщений: 29
1

ImapClient. Декодирование BASE64 KOI8-R

02.05.2014, 17:05. Показов 1753. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите декодировать тело письма

Я использую OPENSSL, продую декодировать стандартными функциями, но выдает пустую строку.
Т.к мне кажется, что алгоритм возвращает UFT8,а следовательно русский режет полностью.
В ответе в заголовке письма указана кодировка KOI8-R.

Пробую так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char *unbase64(char *input, int length)
{
    BIO *b64, *bmem;
 
    char *buffer = (char *)malloc(length);
    memset(buffer, 0, length);
 
    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new_mem_buf(input, length);
    bmem = BIO_push(b64, bmem);
 
    BIO_read(bmem, buffer, length);
 
    BIO_free_all(bmem);
 
    return buffer;
}
ICDzz9fF1Nkg0M8gydPQz8zY2s/Xwc7JwCBHbWFpbCAgICAgICAgICAgICAgICAgICAgICAgKiD6
xNLB19PU19XK1MUsDQrhzMXL08XKISAqICAgICAgICDzz9fF1Nkg0M8gydPQz8zY2s/Xwc7JwCBH
bWFpbCAgICAgICAgICAgICAgICAgICAg78LdwcrUxdPYDQrXIN7B1MUg0NLRzc8g1yDQwdDLxSAi
98jPxNHdycUiICAgIO/CzcXOydfBytTF09gg08/Pwt3FzsnRzckg088g09fPyc3JDQrLz87UwcvU
wc3JIMkg1d7B09TX1crUxSDXIMfS1dDQz9fZyCDXycTFz97B1MHIIMTM0SAxMCDTz8LF08XEzsnL
z9cg1w0KR29vZ2xlKyBIYW5nb3V0cyA8aHR0cDovL3d3dy5nb29nbGUuY29tLysvbGVhcm5tb3Jl
L2hhbmdvdXRzLz9obD1ST

Помогите данную строку в адекватный вид привести.
Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2014, 17:05
Ответы с готовыми решениями:

Декодирование base64
Пытаюсь сохранить картинку из base64, картинка сохраняется, но при её открытии пишет что файл не...

Декодирование base64
При написании UserJS, столкнулся с проблемой: на некотором сайте, в javascript-коде есть переменная...

Декодирование Base64
Здравствуйте. Нужно декодировать письмо из base64. Для этого использую модуль EncdDecd. Он...

Декодирование base64 в byte
Есть строка, в которой текст в base64. Для перевода в Byte использую Convert.FromBase64String. При...

1
Эксперт С++
3072 / 1410 / 425
Регистрация: 19.01.2009
Сообщений: 3,889
03.05.2014, 13:42 2
Лучший ответ Сообщение было отмечено Mayhem_br как решение

Решение

Вот мой велосипед для base64, может пригодится (base64.hpp):
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
74
75
76
77
78
79
80
81
#pragma once
 
#include <string>
#include <cassert>
 
namespace op {
 
class Base64 {
public:
    static std::string encode(const std::string & plain_text) {
        static const std::string base64_chars =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz"
            "0123456789+/";
        const unsigned char * bytes_to_encode =
            (const unsigned char *) plain_text.c_str();
        size_t in_len = plain_text.size();
        std::string ret;
        int i = 0;
        unsigned char ch3[3];
        unsigned char ch4[4];
        while (in_len--) {
            ch3[i++] = *(bytes_to_encode++);
            if (i != 3) continue;
            ch4[0] = ( ch3[0] & 0xfc) >> 2;
            ch4[1] = ((ch3[0] & 0x03) << 4) + ((ch3[1] & 0xf0) >> 4);
            ch4[2] = ((ch3[1] & 0x0f) << 2) + ((ch3[2] & 0xc0) >> 6);
            ch4[3] = ch3[2]   & 0x3f;
            for(i = 0; i < 4 ; ret += base64_chars[ch4[i++]]);
            i = 0;
        }
        if (i) {
            for(int j = i; j < 3;  ch3[j++] = '\0') ;
            ch4[0] = (ch3[0] & 0xfc) >> 2;
            ch4[1] = ((ch3[0] & 0x03) << 4) + ((ch3[1] & 0xf0) >> 4);
            ch4[2] = ((ch3[1] & 0x0f) << 2) + ((ch3[2] & 0xc0) >> 6);
            ch4[3] = ch3[2] & 0x3f;
            for (int j = 0; (j < i + 1); ret += base64_chars[ch4[j++]]) ;
            for ( ; i++ < 3 ; ret += '=' );
        }
        return ret;
    }
    static std::string decode(const std::string & encoded_string) {
        static const std::string base64_chars =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz"
            "0123456789+/";
        int in_len = encoded_string.size();
        int i = 0;
        int j = 0;
        int in_ = 0;
        unsigned char ch4[4], ch3[3];
        std::string ret;
        while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
            ch4[i++] = encoded_string[in_]; in_++;
            if (i == 4) {
                for (i = 0; i <4; i++) { ch4[i] = base64_chars.find(ch4[i]); }
                ch3[0] = (ch4[0] << 2) + ((ch4[1] & 0x30) >> 4);
                ch3[1] = ((ch4[1] & 0xf) << 4) + ((ch4[2] & 0x3c) >> 2);
                ch3[2] = ((ch4[2] & 0x3) << 6) + ch4[3];
                for (i = 0; i < 3; ret += ch3[i++]);
                i = 0;
            }
        }
        if (i) {
            for (j = i; j <4; ch4[j++] = 0);
            for (j = 0; j <4; j++) { ch4[j] = base64_chars.find(ch4[j]); }
            ch3[0] = (ch4[0] << 2) + ((ch4[1] & 0x30) >> 4);
            ch3[1] = ((ch4[1] & 0xf) << 4) + ((ch4[2] & 0x3c) >> 2);
            ch3[2] = ((ch4[2] & 0x3) << 6) + ch4[3];
            for (j = 0; (j < i - 1); ret += ch3[j++]);
        }
        return ret;
    }
private:
    static inline bool is_base64(unsigned char c) {
        return (isalnum(c) || (c == '+') || (c == '/'));
    }
};
 
} // namespace op {
использование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// ...
 
    std::string dec = "ICDzz9fF1Nkg0M8gydPQz8zY2s/Xwc7JwCBHbWFpbCAgICAgICAgICAgICAgICAgICAgICAgKiD6"
                      "xNLB19PU19XK1MUsDQrhzMXL08XKISAqICAgICAgICDzz9fF1Nkg0M8gydPQ z8zY2s/Xwc7JwCBH"
                      "bWFpbCAgICAgICAgICAgICAgICAgICAg78LdwcrUxdPYDQrXIN7B1MUg0NLR zc8g1yDQwdDLxSAi"
                      "98jPxNHdycUiICAgIO/CzcXOydfBytTF09gg08/Pwt3FzsnRzckg088g09fPyc3JDQrLz87UwcvU"
                      "wc3JIMkg1d7B09TX1crUxSDXIMfS1dDQz9fZyCDXycTFz97B1MHIIMTM0SAx MCDTz8LF08XEzsnL"
                      "z9cg1w0KR29vZ2xlKyBIYW5nb3V0cyA8aHR0cDovL3d3dy5nb29nbGUuY29t LysvbGVhcm5tb3Jl"
                      "L2hhbmdvdXRzLz9obD1ST";
    std::string dec2(op::Base64::decode(dec));
    std::cout << dec2 << std::endl;
 
// ...
2
03.05.2014, 13:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2014, 13:42
Помогаю со студенческими работами здесь

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

Декодирование base64-изображений
Бывший сотрудник фирмы в своем html разместил картинки в таком виде...

Кодирование и декодирование в base64
Доброго времени суток, форумчане. У меня проблема. Я интернете нашла пример как кодировать и...

Кодировка koi8-r
Всем привет! поискал по всему интернету про кодировку koi8-r нашел кое-что про нее, но чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru