Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.185.170] |
|
Сообщ.
#1
,
|
|
|
Вроде понял как это делается, но CryptStringToBinary упорно выдает мусор при конвертации. Подскажите где ошибка?
#include <wincrypt.h> #pragma comment(lib,"Crypt32.lib") void CCrypTestDlg::OnOK() { //Начальная картинка в BASE64 - PNG - data:image/png;base64,iVBORw0.... CString sString; BYTE *buffer = NULL; BYTE *pbyteByte = NULL; DWORD dwSkip; DWORD dwFlags; DWORD dwDataLen; sString = _T("iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEKklEQVR4nO2VTUsjWRSGn/pIxUjUUvJhq1FHRMhCIqgLVzr/QHAx4EZBcDv9C2Zm1429dTWNisthGgZ/QTsrwQ90QBFlbNv40ekoxo5lElOpurMw0aiVRBsaZtEv3EVR7znve8499174jv8xIkACEA5rzoE/V4IrgLFSIlIZA7+6XK7furq66OzspKWlBSEEq6urLC8vO8WKcDhMX18fPp+PWCzG/v4+W1tbXF5eLgI/OomoZQwwPT1NbW0dzc1t+P1+TNPk06cj3r79nXfv/rzHDYfDvHo1xYsXzeh6PcnkF05Ojvj8+YTJycmSGmUN7O7u4vcHEEIim70ml8vx4cMep6fxR9yrqxR7e/9i24JUKsXFxTlHR4dEowflJBxRBwwCP1N6T987xP1Vhj+Xz1n3MMhpBt57PJ4ht9uNy+VCURQURUGSpNsVjUYBdOBLUVwiFArphQ/btrFtG8uyyOVyZDIZUqnUR+CHYrGHWzAoSdJQR0cHjY2NNDQ0UFNTQ3V1NZqmoaoqsiwzOztLPB4fAhbycZGamhp9dHQUAMuyyGazZDIZDMPg4uKCs7Mz1tfX203THAPmC4LyAwPjXq8XRVEcGnOHzs5OgHFujmoEeNnU1FQ2BkDXdYCXpTpQB4y7XK6KifJiw/kFQCgUqhjndrsBeoA24ADud2AIQJLKXQ130DSNiYkJxsbG8Hq9aJpWMUaW5UJ3b40XGxh2En+qoacin2/IyUBPsZgkSciyfG/6nysky/Jtjq82oCgKsvxwVh+jwBFCPBJ3KEDnZnhvh3BQkiR0Xcfn8+H1enG73ViWxc7ODqZpUltbS319PcFg0LEbsixzfX3N+fk5p6enJJNJFEWhubkZTdPweDzouo5lWcRiMSzLagf+KRhod6pK0zTC4TCGYXBwcEAymeTw8BCnk2IYBhsbG5imCUBLSwsNDQ2k02kymcwjs5Zl9QALhd62P6xKCIFt2wgh8Pv99Pb24vF4sG2bePzxWxCPxzFNE5fLRXd3N6FQCFmWEUI84ua12uFuBnqcOlAwIoRAVVVaW1tR1dLvlyRJBINBqqqqSnKKcM+AXmnKC5UYhlGSk8vlSlbtAL3YwJNg2zbb29uk0+lfstksMzMzzM/PYxgGpmn+sbm5iW3bFfPki+2Bu1NQcgseIp1OMzIy8hp4zc1TCzevqnjz5s1Pzymo2EDFLShACMHU1JT5XKFSkAD6+/tFueEqRi6XY2VlxdHt1+RRAVRVxefzkUgkiEajGIZBJBIhEonQ0dGB2+0mlUqxtrbG3t5eyaSqqhIIBOjr6yMQCGDbNsfHx2xubrK+vs7V1RVtbW0Eg0ESiQRQNIRPGZ5vgYKBxXQ6XZGcv9E+lqFsWJb1rDwSwMDAwCCwWDHyBkNLS0t/O/14Zp7hpaWlhcq07/jG+A+fpJryw4VpCQAAAABJRU5ErkJggg=="); char* pszInput = T2A((LPTSTR) (LPCTSTR) sString); //Декодируем картинку в бинари if(! CryptStringToBinary( pszInput, _tcslen( pszInput ) + 1, CRYPT_STRING_BASE64, buffer, &dwDataLen, &dwSkip, &dwFlags ) ) { DWORD dw = GetLastError(); //0x0000000d: Если ошибка } pbyteByte = new BYTE[ dwDataLen ]; if( !pbyteByte ) { DWORD m_dwError = ERROR_INVALID_DATA; } //Объект доступа к файловой системе HANDLE mhFile; CFile mFile; //Открываем файл mhFile = ::CreateFile("C:\\test.png", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //Если доступ к файлу получен if (mhFile != INVALID_HANDLE_VALUE){ //Передаём указатель на объект hFile mFile.m_hFile = mhFile; //Записываем заголовок файла mFile.Write(pbyteByte, dwDataLen); //Закрываем файл mFile.Close(); } //Удаляем указатель delete pbyteByte; } |
Сообщ.
#2
,
|
|
|
Цитата MaIron @ но CryptStringToBinary упорно выдает мусор при конвертации. Как-то всё смешалось... Тут "_T()" sString = _T("iVBORw0KGgoAAAANSUhEUgAAAC... Предположим, преобразовал в ASCII char* pszInput = T2A((LPTSTR) (LPCTSTR) sString); А дальше опять "_T()": ... _tcslen( pszInput ) + 1, ... Тут нет "_T()" //Открываем файл mhFile = ::CreateFile("C:\\test.png", |
Сообщ.
#3
,
|
|
|
Макросы тут не причем.
Разобрался. Два раза нужно было вызвать CryptStringToBinary - первый раз получить размер, второй получить последовательность. #include <wincrypt.h> #pragma comment(lib,"Crypt32.lib") void CCrypTestDlg::OnOK() { //Начальная картинка в BASE64 - PNG - data:image/png;base64,iVBORw0.... CString sString; BYTE *buffer = NULL; BYTE *pbyteByte = NULL; DWORD dwSkip; DWORD dwFlags; DWORD dwDataLen; sString = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEKklEQVR4nO2VTUsjWRSGn/pIxUjUUvJhq1FHRMhCIqgLVzr/QHAx4EZBcDv9C2Zm1429dTWNisthGgZ/QTsrwQ90QBFlbNv40ekoxo5lElOpurMw0aiVRBsaZtEv3EVR7znve8499174jv8xIkACEA5rzoE/V4IrgLFSIlIZA7+6XK7furq66OzspKWlBSEEq6urLC8vO8WKcDhMX18fPp+PWCzG/v4+W1tbXF5eLgI/OomoZQwwPT1NbW0dzc1t+P1+TNPk06cj3r79nXfv/rzHDYfDvHo1xYsXzeh6PcnkF05Ojvj8+YTJycmSGmUN7O7u4vcHEEIim70ml8vx4cMep6fxR9yrqxR7e/9i24JUKsXFxTlHR4dEowflJBxRBwwCP1N6T987xP1Vhj+Xz1n3MMhpBt57PJ4ht9uNy+VCURQURUGSpNsVjUYBdOBLUVwiFArphQ/btrFtG8uyyOVyZDIZUqnUR+CHYrGHWzAoSdJQR0cHjY2NNDQ0UFNTQ3V1NZqmoaoqsiwzOztLPB4fAhbycZGamhp9dHQUAMuyyGazZDIZDMPg4uKCs7Mz1tfX203THAPmC4LyAwPjXq8XRVEcGnOHzs5OgHFujmoEeNnU1FQ2BkDXdYCXpTpQB4y7XK6KifJiw/kFQCgUqhjndrsBeoA24ADud2AIQJLKXQ130DSNiYkJxsbG8Hq9aJpWMUaW5UJ3b40XGxh2En+qoacin2/IyUBPsZgkSciyfG/6nysky/Jtjq82oCgKsvxwVh+jwBFCPBJ3KEDnZnhvh3BQkiR0Xcfn8+H1enG73ViWxc7ODqZpUltbS319PcFg0LEbsixzfX3N+fk5p6enJJNJFEWhubkZTdPweDzouo5lWcRiMSzLagf+KRhod6pK0zTC4TCGYXBwcEAymeTw8BCnk2IYBhsbG5imCUBLSwsNDQ2k02kymcwjs5Zl9QALhd62P6xKCIFt2wgh8Pv99Pb24vF4sG2bePzxWxCPxzFNE5fLRXd3N6FQCFmWEUI84ua12uFuBnqcOlAwIoRAVVVaW1tR1dLvlyRJBINBqqqqSnKKcM+AXmnKC5UYhlGSk8vlSlbtAL3YwJNg2zbb29uk0+lfstksMzMzzM/PYxgGpmn+sbm5iW3bFfPki+2Bu1NQcgseIp1OMzIy8hp4zc1TCzevqnjz5s1Pzymo2EDFLShACMHU1JT5XKFSkAD6+/tFueEqRi6XY2VlxdHt1+RRAVRVxefzkUgkiEajGIZBJBIhEonQ0dGB2+0mlUqxtrbG3t5eyaSqqhIIBOjr6yMQCGDbNsfHx2xubrK+vs7V1RVtbW0Eg0ESiQRQNIRPGZ5vgYKBxXQ6XZGcv9E+lqFsWJb1rDwSwMDAwCCwWDHyBkNLS0t/O/14Zp7hpaWlhcq07/jG+A+fpJryw4VpCQAAAABJRU5ErkJggg=="; //Получаем размер файла if(! CryptStringToBinary( sString.GetBuffer(), sString.GetLength(), CRYPT_STRING_BASE64, NULL, &dwDataLen, NULL, NULL ) ) { DWORD dw = GetLastError(); //0x0000000d: Если ошибка } pbyteByte = new BYTE[ dwDataLen ]; if( !pbyteByte ) { DWORD m_dwError = ERROR_INVALID_DATA; } //Получаем байты if(! CryptStringToBinary( sString.GetBuffer(), sString.GetLength(), CRYPT_STRING_BASE64, pbyteByte, &dwDataLen, NULL, NULL ) ) { DWORD dw = GetLastError(); //0x0000000d: Если ошибка } //Объект доступа к файловой системе HANDLE mhFile; CFile mFile; //Открываем файл mhFile = ::CreateFile("C:\\test.png", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //Если доступ к файлу получен if (mhFile != INVALID_HANDLE_VALUE){ //Передаём указатель на объект hFile mFile.m_hFile = mhFile; //Записываем заголовок файла mFile.Write(pbyteByte, dwDataLen); //Закрываем файл mFile.Close(); } //Удаляем указатель delete pbyteByte; } |