На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Картинка из BASE64 в файл PNG
    Вроде понял как это делается, но CryptStringToBinary упорно выдает мусор при конвертации. Подскажите где ошибка?

    ExpandedWrap disabled
      #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;
      }
      Цитата MaIron @
      но CryptStringToBinary упорно выдает мусор при конвертации.

      Как-то всё смешалось...
      Тут "_T()"
      ExpandedWrap disabled
            sString = _T("iVBORw0KGgoAAAANSUhEUgAAAC...

      Предположим, преобразовал в ASCII
      ExpandedWrap disabled
        char* pszInput = T2A((LPTSTR) (LPCTSTR) sString);


      А дальше опять "_T()":
      ExpandedWrap disabled
        ...
                _tcslen( pszInput ) + 1,
        ...

      Тут нет "_T()"
      ExpandedWrap disabled
            //Открываем файл
            mhFile = ::CreateFile("C:\\test.png",
        Макросы тут не причем.
        Разобрался. Два раза нужно было вызвать CryptStringToBinary - первый раз получить размер, второй получить последовательность.

        ExpandedWrap disabled
          #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;
          }
        Сообщение отредактировано: MaIron -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0293 ]   [ 16 queries used ]   [ Generated: 25.04.24, 03:56 GMT ]