Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Кодирование Base64Encode

38K
27 июля 2008 года
bdv1983
12 / / 27.07.2008
Здравствуйте!

Мне нужно подготовить строку для авторизации на smtp.mail.ru, для этого использую команду AUTH PLAIN <кодированная строка>. Например для авторизации на [email]test@mail.ru[/email] нужно закодировать строку: "test<NULL>test@mail.ru<NULL>0123" ->dGVzdAB0ZXN0QG1haWwucnUAMDEyMw==. Вопрос в том, как сформировать строку для Base64Encode на C++? Пытаюсь
 
Код:
char src[200] = "test\ntest@mail.ru\n0123";
    int dest_len = Base64EncodeGetRequiredLength(strlen(src));
    ZeroMemory(&dest, dest_len);
    if(Base64Encode((BYTE *)src, strlen(src), dest, &dest_len))
        MessageBox(0, dest, "Строка для аутентификации", MB_OK);

, но вместо требуемого получаю dGVzdAp0ZXN0QG1haWwucnUKMDEyMw==. Разница в двух символах и авторизация не проходит.
14
28 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Верно, потому что в первом случае для разделения строк используется \0, а в твоем - \n
38K
28 июля 2008 года
bdv1983
12 / / 27.07.2008
Phodopus, спасибо за ответ.
Сегодня провозился полдня, но всё-таки получил правильный результат:
 
Код:
char src[200] = "test\000test@mail.ru\0000123";
int dest_len = Base64EncodeGetRequiredLength(22);
ZeroMemory(&dest, dest_len);
if(Base64Encode((BYTE *)src, 22, dest, &dest_len))
    MessageBox(0, dest, "Строка для аутентификации", MB_OK);

Этот код позволяет получить правильную строку в base64 - dGVzdAB0ZXN0QG1haWwucnUAMDEyMw==.
Здесь в кодируемой строке вместо <NULL> пришлось вставить \000 - восьмеричный код 0-го символа. И далее в коде вместо strlen(src) подставить действительную длину строки.
Теперь необходимо придумать как формировать строку src программно, а не задавать константой:
 
Код:
char login[10] = "test";
char email[20] = "test@mail.ru";
char pass[10] = "0123";
char src[200];

У кого какие идеи?
3
28 июля 2008 года
Green
4.8K / / 20.01.2000
Цитата: bdv1983

Здесь в кодируемой строке вместо <NULL> пришлось вставить \000 - восьмеричный код 0-го символа.


Ну в любой книге по С и ли С++ говориться про "Escape Sequences". Для этого не надо убивать полдня.
Страно, что про \n ты не знал, а про \0 - нет.

Цитата: bdv1983

И далее в коде вместо strlen(src) подставить действительную длину строки.


Это тоже вполне понятно и логично. strlen - возвращает длину C-строки, а у тебя src - не строка вовсе.

Цитата: bdv1983

Теперь необходимо придумать как формировать строку src программно, а не задавать константой:
 
Код:
char login[10] = "test";
char email[20] = "test@mail.ru";
char pass[10] = "0123";
char src[200];

У кого какие идеи?


Идея проста: возьми любую книгу по С или С++ и начинай учить язык. Вопросы, которые ты задаешь, элементарные. Это основа, которую ты должен выучить.

P.S. Тема переезжает в раздел ленивые "Студенты".

40K
28 июля 2008 года
mrc
5 / / 26.07.2008
Динамически задавать
1. функцией void *malloc(size_t size); (C без ++)
 
Код:
void* p;
p=malloc(10);
scanf("%10s", p);


2. оператором new (C++)
 
Код:
char* login=new char[10];
login="test";


"Основа которую нужно выучить". Человеку нужен конкретный ответ, а не е**е рекомендации.
3
28 июля 2008 года
Green
4.8K / / 20.01.2000
Цитата: mrc
Динамически задавать
1. функцией void *malloc(size_t size); (C без ++)
 
Код:
void* p;
p=malloc(10);
scanf("%10s", p);


Причем тут scanf ?

Цитата: mrc

2. оператором new (C++)
 
Код:
char* login=new char[10];
login="test";


Кто тебя учил так делать?
Тебе, как и автору: читайте книги!

Цитата: mrc

"Основа которую нужно выучить". Человеку нужен конкретный ответ, а не е**е рекомендации.


mrc, ты не только бредовые и неправильные примеры привел, они ещё и не относятся к сути вопроса автора.
Это и есть твой "конкретный ответ"?

P.S. mrc, пока обойдешься предупреждением.

1.9K
28 июля 2008 года
max_dark
256 / / 11.11.2005
2mrc Слезай с паскаля, слезай... Кроме того, что выделил память, так еще и выбросил ее "на свалку", приравняв login указателю на константу "test". Компилится и ладно :D

2bdv1983 на счет идей. Набросал на коленке:
Код:
int prepare(char* dest, char* login, char* email, char* pass) {
    int result_len=0;
    int len=strlen(login);
    strcpy(dest, login);
    result_len+=len+1;
    len=strlen(email);
    strcpy(&dest[result_len], email);
    result_len+=len+1;
    len=strlen(pass);
    strcpy(&dest[result_len], pass);
    return result_len+len;
}
3
29 июля 2008 года
Green
4.8K / / 20.01.2000
max_dark, обрати внимание на ф-цию strcat.
Кроме того, необходимо контролировать размер переданной через dest выделенной области памяти. Это проще всего сделать путем явной передачи размера, как еще один параметр ф-ции.
Остальные параметры (login, email, pass) лучше передавать через константные указатели (const char*).

Ну а вообще, если используется C++, то лучше воспользоваться классом string.
1.9K
29 июля 2008 года
max_dark
256 / / 11.11.2005
Green, спасибо за замечание.
Про strcat я знаю, но в данном случае после login и email необходимо вставлять \0, что неявно делает strcpy. strcat же будет его перезаписывать на первый символ второго параметра.
С учетом размера буфера:
Код:
int prepare(char* dest, int dest_size, const char* login, const char* email, const char* pass) {
    int result_len=0;
    int login_len, email_len,pass_len;
    login_len=strlen(login);
    email_len=strlen(email);
    pass_len=strlen(pass);
    /*
        размер буфера должен быть не менее
    суммы длин входных параметров + 3 байта под \0 символы
    */
    if ( (dest_size - login_len - email_len - pass_len - 3) < 0 ) {
        return -1; // памяти не достаточно
    }
    strcpy(dest, login);
    result_len+=login_len+1; // перескакиваем \0
    strcpy(&dest[result_len], email);
    result_len+=email_len+1; // перескакиваем \0
    strcpy(&dest[result_len], pass);
    return result_len+pass_len;
}
38K
29 июля 2008 года
bdv1983
12 / / 27.07.2008
Green, вопросы конечно простые, не так часто приходится работать с C, больше всякие SQL.
А вот вопрос может быть не такой элементарный. Полученную строку для аутентификации проверяю через Telnet:
AUTH PLAIN dGVzdAB0ZXN0QG1haWwucnUAMDEyMw==, в ответ получаю 235 Authentication succeeded. При попытке же отправить данную строку программно:
 
Код:
strcpy(text, "AUTH PLAIN ");
    strcat(text, dest);
    strcat(text, "\r\n");
    send(s, text,strlen(text),0);
    printf("send - %s", text);
    // ждем подтверждение от сервера
    recv(s,text,sizeof(text),0);
    printf("recv (AUTH PLAIN) - %s", text);

в ответ получаю 235 Authentication succeeded
zQDFGhWcnUAMjUxMQ==. Что за непонятное добавление? Последующая команда MAIL FROM: уже не проходит.
38K
29 июля 2008 года
bdv1983
12 / / 27.07.2008
Сейчас заметил что в ответ приходит не просто случайное добавление, а часть строки аутентификации, т.е. на строку AUTH PLAIN dGVzdAB0ZXN0QG1haWwucnUAMDEyMw== приходит ответ 235 Authentication succeeded
0QG1haWwucnUAMDEyMw==. Видимо надо как-то по-другому принимать ответ сервера.
38K
29 июля 2008 года
bdv1983
12 / / 27.07.2008
Совсем отупел, дело не в ответе, а в самой команде MAIL FROM: у строки на конце не стояло \n. Тема закрыта.
38K
29 июля 2008 года
bdv1983
12 / / 27.07.2008
Дело было в MAIL FROM: в конце строки не было \n. Тема закрыта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог