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);
Кодирование Base64Encode
Мне нужно подготовить строку для авторизации на smtp.mail.ru, для этого использую команду AUTH PLAIN <кодированная строка>. Например для авторизации на [email]test@mail.ru[/email] нужно закодировать строку: "test<NULL>test@mail.ru<NULL>0123" ->dGVzdAB0ZXN0QG1haWwucnUAMDEyMw==. Вопрос в том, как сформировать строку для Base64Encode на C++? Пытаюсь
Код:
, но вместо требуемого получаю dGVzdAp0ZXN0QG1haWwucnUKMDEyMw==. Разница в двух символах и авторизация не проходит.
Верно, потому что в первом случае для разделения строк используется \0, а в твоем - \n
Сегодня провозился полдня, но всё-таки получил правильный результат:
Код:
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);
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];
char email[20] = "test@mail.ru";
char pass[10] = "0123";
char src[200];
У кого какие идеи?
Цитата: 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];
char email[20] = "test@mail.ru";
char pass[10] = "0123";
char src[200];
У кого какие идеи?
Идея проста: возьми любую книгу по С или С++ и начинай учить язык. Вопросы, которые ты задаешь, элементарные. Это основа, которую ты должен выучить.
P.S. Тема переезжает в раздел ленивые "Студенты".
1. функцией void *malloc(size_t size); (C без ++)
Код:
void* p;
p=malloc(10);
scanf("%10s", p);
p=malloc(10);
scanf("%10s", p);
2. оператором new (C++)
Код:
char* login=new char[10];
login="test";
login="test";
"Основа которую нужно выучить". Человеку нужен конкретный ответ, а не е**е рекомендации.
Цитата: mrc
Динамически задавать
1. функцией void *malloc(size_t size); (C без ++)
1. функцией void *malloc(size_t size); (C без ++)
Код:
void* p;
p=malloc(10);
scanf("%10s", p);
p=malloc(10);
scanf("%10s", p);
Причем тут scanf ?
Цитата: mrc
2. оператором new (C++)
Код:
char* login=new char[10];
login="test";
login="test";
Кто тебя учил так делать?
Тебе, как и автору: читайте книги!
Цитата: mrc
"Основа которую нужно выучить". Человеку нужен конкретный ответ, а не е**е рекомендации.
mrc, ты не только бредовые и неправильные примеры привел, они ещё и не относятся к сути вопроса автора.
Это и есть твой "конкретный ответ"?
P.S. mrc, пока обойдешься предупреждением.
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;
}
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;
}
Кроме того, необходимо контролировать размер переданной через dest выделенной области памяти. Это проще всего сделать путем явной передачи размера, как еще один параметр ф-ции.
Остальные параметры (login, email, pass) лучше передавать через константные указатели (const char*).
Ну а вообще, если используется C++, то лучше воспользоваться классом string.
Про 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;
}
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;
}
А вот вопрос может быть не такой элементарный. Полученную строку для аутентификации проверяю через 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);
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: уже не проходит.
0QG1haWwucnUAMDEyMw==. Видимо надо как-то по-другому принимать ответ сервера.
Совсем отупел, дело не в ответе, а в самой команде MAIL FROM: у строки на конце не стояло \n. Тема закрыта.
Дело было в MAIL FROM: в конце строки не было \n. Тема закрыта.