Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перекодировать файл в base64 
V
    Опции темы
kefir01
Дата 29.10.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Код

    FILE *stream = fopen("touc.jpg","rb");
    char *buff;
    long size;
    int bytecount;
    size_t result;

    fseek(stream,0,SEEK_END);
    size = ftell(stream);
    rewind(stream);

    buff = (char*) malloc (sizeof(char)*size);
    result = fread (buff,1,size,stream);
    rewind(stream);


    AnsiString x;
    for(int i=0;i<result;i++)
    {
    x += Base64Encode(AnsiString(buff[i]));
    }


Вот так делаю - получается не то содержание (есть этот же файл, закодированный правильно в base64)
Не скажете в чем ошибка? Работаю с кодированием в первый раз, так что палками не бейте, пожалуйста...

РЕШЕНИЕ ПРОБЛЕМЫ В ПОСЛЕДНЕМ СООБЩЕНИИ.
Там примеры кода по кодированию файла в base 64 и записи его в XML, а также последующее восстановление...


Это сообщение отредактировал(а) kefir01 - 7.11.2008, 16:33
PM MAIL   Вверх
xvr
Дата 29.10.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



В Base64Encode надо скармливать ВЕСЬ блок данных за раз, по байту работать не будет

PM MAIL   Вверх
kefir01
Дата 29.10.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Т.е. как сделать  smile 
В смысле как скормить все

Это сообщение отредактировал(а) kefir01 - 29.10.2008, 16:05
PM MAIL   Вверх
xvr
Дата 29.10.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(kefir01 @ 29.10.2008,  16:05)
Т.е. как сделать  smile 
В смысле как скормить все

Код

AnsiString x = Base64Encode(AnsiString(buff,result));

PM MAIL   Вверх
kefir01
Дата 29.10.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Хм, мне кажется что все не так просто - получился такой файл
Код

MGy5ElZyZk2WIkrnkyGy6iVDZRYRazbAnRKlsklRKzbAl/3qRQ13
oAry3G2tUiihLdVSAz5buuiKNIwKFxcV0RibxpGfM+6umwco3alK
4ELw00xJkTw1omWmRPDWiZaZWmhrRM0TKjw0kzchdK1TEMq
wCgAjjrMstIlMCXZsqQB6Bld6oQykBMlMAoAY9AEElIBlaAPoAKCA
oAKgVh/mUBY//9k=


Что явно меньше файла в 154 кб..

Это сообщение отредактировал(а) kefir01 - 29.10.2008, 16:18
PM MAIL   Вверх
jonie
Дата 30.10.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



http://e-jonie.narod.ru/src/base64/base64.rar
вот когда-то писал для потоков stl.. может "будет проще" .. да и памяти жрет поменьше всяко


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 30.10.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(kefir01 @ 29.10.2008,  16:18)
Хм, мне кажется что все не так просто - получился такой файл
Код

MGy5ElZyZk2WIkrnkyGy6iVDZRYRazbAnRKlsklRKzbAl/3qRQ13
oAry3G2tUiihLdVSAz5buuiKNIwKFxcV0RibxpGfM+6umwco3alK
4ELw00xJkTw1omWmRPDWiZaZWmhrRM0TKjw0kzchdK1TEMq
wCgAjjrMstIlMCXZsqQB6Bld6oQykBMlMAoAY9AEElIBlaAPoAKCA
oAKgVh/mUBY//9k=


Что явно меньше файла в 154 кб..

Хм, должно работать. Какая версия BCB? (У 3.0 есть бага в AnsiString(char*,int) - оно обрезает входную строку по первому нулю, хотя и не должно)

PM MAIL   Вверх
kefir01
Дата 30.10.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



BCB6 
вообще значение buff = "яЩяа", может поэтому получается так мало... 

Это сообщение отредактировал(а) kefir01 - 30.10.2008, 13:37
PM MAIL   Вверх
xvr
Дата 30.10.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(kefir01 @ 30.10.2008,  13:37)
BCB6 
вообще значение buff = "яЩяа", может поэтому получается так мало...

Это не должно было помешать. Давай исходники программы, будем смотреть  smile 
PM MAIL   Вверх
Alca
Дата 30.10.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Encoding and decoding base64 with C++

The cpp file
base64.cpp
Код

/* 
   base64.cpp and base64.h

   Copyright (C) 2004-2008 Rene Nyffenegger

   This source code is provided 'as-is', without any express or implied
   warranty. In no event will the author be held liable for any damages
   arising from the use of this software.

   Permission is granted to anyone to use this software for any purpose,
   including commercial applications, and to alter it and redistribute it
   freely, subject to the following restrictions:

   1. The origin of this source code must not be misrepresented; you must not
      claim that you wrote the original source code. If you use this source code
      in a product, an acknowledgment in the product documentation would be
      appreciated but is not required.

   2. Altered source versions must be plainly marked as such, and must not be
      misrepresented as being the original source code.

   3. This notice may not be removed or altered from any source distribution.

   Rene Nyffenegger [email protected]

*/

#include "base64.h"
#include <iostream>

static const std::string base64_chars = 
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";


static inline bool is_base64(unsigned char c) {
  return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  std::string ret;
  int i = 0;
  int j = 0;
  unsigned char char_array_3[3];
  unsigned char char_array_4[4];

  while (in_len--) {
    char_array_3[i++] = *(bytes_to_encode++);
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      char_array_4[3] = char_array_3[2] & 0x3f;

      for(i = 0; (i <4) ; i++)
        ret += base64_chars[char_array_4[i]];
      i = 0;
    }
  }

  if (i)
  {
    for(j = i; j < 3; j++)
      char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
    char_array_4[3] = char_array_3[2] & 0x3f;

    for (j = 0; (j < i + 1); j++)
      ret += base64_chars[char_array_4[j]];

    while((i++ < 3))
      ret += '=';

  }

  return ret;

}

std::string base64_decode(std::string const& encoded_string) {
  int in_len = encoded_string.size();
  int i = 0;
  int j = 0;
  int in_ = 0;
  unsigned char char_array_4[4], char_array_3[3];
  std::string ret;

  while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
    char_array_4[i++] = encoded_string[in_]; in_++;
    if (i ==4) {
      for (i = 0; i <4; i++)
        char_array_4[i] = base64_chars.find(char_array_4[i]);

      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

      for (i = 0; (i < 3); i++)
        ret += char_array_3[i];
      i = 0;
    }
  }

  if (i) {
    for (j = i; j <4; j++)
      char_array_4[j] = 0;

    for (j = 0; j <4; j++)
      char_array_4[j] = base64_chars.find(char_array_4[j]);

    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

    for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  }

  return ret;
}
The header file
base64.h
#include <string>

std::string base64_encode(unsigned char const* , unsigned int len);
std::string base64_decode(std::string const& s);
The test file
#include "base64.h"
#include <iostream>

int main() {
  const std::string s = "ADP GmbH\nAnalyse Design & Programmierung\nGesellschaft mit beschrankter Haftung" ;

  std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(s.c_str()), s.length());
  std::string decoded = base64_decode(encoded);

  std::cout << "encoded: " << encoded << std::endl;
  std::cout << "decoded: " << decoded << std::endl;

  return 0;
}





--------------------
PM WWW ICQ Skype Jabber   Вверх
kefir01
Дата 5.11.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Вот код:
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    _di_IXMLDocument XML;
    _di_IXMLNode Root;
    _di_IXMLNode cData, Message;

    XML = LoadXMLDocument("1.xml");
    cData = XML->CreateNode(WideString("CDATA"),ntCData);


    FILE *stream = fopen("touc.jpg","rb");
    char *buff;
    long size;
    int bytecount;
    size_t result;

    fseek(stream,0,SEEK_END);
    size = ftell(stream);
    rewind(stream);

    buff = (char*) malloc (sizeof(char)*size);
    result = fread (buff,1,size,stream);

    AnsiString x = Base64Encode(AnsiString(buff,result));

    cData->Text = x;
    Root = XML->DocumentElement->ChildNodes->GetNode(WideString("Table"));
    Message = Root->ChildNodes->GetNode(WideString("message"));
    Message->DOMNode->appendChild(cData->DOMNode,NULL);

  XML->SaveToFile("2.xml");
}


По-прежнему не работает

Это сообщение отредактировал(а) kefir01 - 5.11.2008, 15:46
PM MAIL   Вверх
xvr
Дата 5.11.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(kefir01 @ 5.11.2008,  15:45)
Вот код:
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    _di_IXMLDocument XML;
    _di_IXMLNode Root;
    _di_IXMLNode cData, Message;

    XML = LoadXMLDocument("1.xml");
    cData = XML->CreateNode(WideString("CDATA"),ntCData);


    FILE *stream = fopen("touc.jpg","rb");
    char *buff;
    long size;
    int bytecount;
    size_t result;

    fseek(stream,0,SEEK_END);
    size = ftell(stream);
    rewind(stream);

    buff = (char*) malloc (sizeof(char)*size);
    result = fread (buff,1,size,stream);

    AnsiString x = Base64Encode(AnsiString(buff,result));

    cData->Text = x;
    Root = XML->DocumentElement->ChildNodes->GetNode(WideString("Table"));
    Message = Root->ChildNodes->GetNode(WideString("message"));
    Message->DOMNode->appendChild(cData->DOMNode,NULL);

  XML->SaveToFile("2.xml");
}


По-прежнему не работает

Натурные испытания показали, что функция Base64Encode (из Indy) глючит не по детски  smile Используй вместо нее EncodeString из encddecd.hpp - она вроде работает

PM MAIL   Вверх
kefir01
Дата 5.11.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Воистину Работает! А чем декодировать теперь?
PM MAIL   Вверх
xvr
Дата 5.11.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(kefir01 @ 5.11.2008,  19:24)
Воистину Работает! А чем декодировать теперь?

DecodeString вестимо  smile 
PM MAIL   Вверх
kefir01
  Дата 6.11.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Да я уже разобрался через минуту как запостил)

А вот почему вылетает данный код?

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    _di_IXMLDocument XML;
    _di_IXMLNode Root;
    _di_IXMLNode cData, Message;
    char *decoded;

    XML = LoadXMLDocument("2.xml");
    Root = XML->DocumentElement->ChildNodes->GetNode(WideString("Table"));
    Message = Root->ChildNodes->GetNode(WideString("message"));
    cData = Message->ChildNodes->GetNode(OleVariant(0));

    decoded = DecodeString(cData->Text).c_str();
    FILE *stream = fopen("toucD.jpg","wb");
    fprintf(stream,decoded); //тут!
    fclose(stream);

}

Как вообще раскодированные данные как двоичные записать в файл?

Это сообщение отредактировал(а) kefir01 - 6.11.2008, 17:46
PM MAIL   Вверх
xvr
Дата 6.11.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Вылетает потому что fprintf интерпретирует твои двоичные данные как форматную строку. И что за форматы он там найдет - одному богу известно.
Пользуйся fwrite:
Код

String decoded = DecodeString(cData->Text);
FILE *stream = fopen("toucD.jpg","wb");
fwrite(decoded.c_str(),1,decoded.Length(),stream);
fclose(stream);

PM MAIL   Вверх
kefir01
Дата 6.11.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Не прокатило - вписал только яШща и все...

Добавлено @ 18:13
А не все работает! Ступил))

Спасибо огромное! smile 

Итак, кому надо
Заголовки:
Код

#include <stdio.h>
#include <encddecd.hpp>


Запись:
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    _di_IXMLDocument XML;
    _di_IXMLNode Root;
    _di_IXMLNode cData, Message;

    XML = LoadXMLDocument("1.xml");
    cData = XML->CreateNode(WideString("CDATA"),ntCData);


    FILE *stream = fopen("touc.jpg","rb");
    char *buff;
    long size;
    size_t result;

    fseek(stream,0,SEEK_END);
    size = ftell(stream);
    rewind(stream);

    buff = (char*) malloc (sizeof(char)*size);
    result = fread (buff,1,size,stream);

    AnsiString x = EncodeString(AnsiString(buff,result));

    cData->Text = x;
    Root = XML->DocumentElement->ChildNodes->GetNode(WideString("Table"));
    Message = Root->ChildNodes->GetNode(WideString("message"));
    Message->DOMNode->appendChild(cData->DOMNode,NULL);

  XML->SaveToFile("2.xml");

}


Чтение:
Код

    _di_IXMLDocument XML;
    _di_IXMLNode Root;
    _di_IXMLNode cData, Message;
    AnsiString decoded;

    XML = LoadXMLDocument("2.xml");
    Root = XML->DocumentElement->ChildNodes->GetNode(WideString("Table"));
    Message = Root->ChildNodes->GetNode(WideString("message"));
    cData = Message->ChildNodes->GetNode(OleVariant(0));

    decoded = DecodeString(cData->Text);
    FILE *stream = fopen("toucD.jpg","wb");
    fwrite(decoded.c_str(),1,decoded.Length(),stream);
    fclose(stream);



Это сообщение отредактировал(а) kefir01 - 6.11.2008, 18:15
PM MAIL   Вверх
Alca
Дата 7.11.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Cryptography using the Win32 Cryptography API

Это сообщение отредактировал(а) Alca - 10.11.2008, 10:02

Присоединённый файл ( Кол-во скачиваний: 30 )
Присоединённый файл  Base64_2.2.2.zip 44,39 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 8.11.2008, 00:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Alca @ 7.11.2008,  22:05)
Cryptography using the Win32 Cryptography API

Сильная статья. Очень напоминает инструкцию по забиванию гвоздей микроскопом  smile 
PM MAIL   Вверх
Alca
Дата 8.12.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



base64.zip

Присоединённый файл ( Кол-во скачиваний: 50 )
Присоединённый файл  base64.zip 4,33 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1076 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.