Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемка с кодом 
:(
    Опции темы
proman
Дата 13.5.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



привет! 
Вобщем проблема такая: мне надо кодировать и декодировать фаил в формат Base64 
грубо говоря схема такая: 
"деление три к четырем" из трех бай делаем 4 по 6 Бит 
Кароче из файла читаем по 57 байт и каждые 57 байт переводим в строку по 76 символов. 
Тут всё работает только не понятно там где между звездочек выделено. 
HANDLE FileData; 
DWORD nReadBytes; 
const char base64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 


long base64encode(const char* FileName, char* buffer,unsigned  int length) 
{ 
   //Я сделал чтение из файла по 57 байт, чтоб не сильно переиначивать функшу по сравнению с uu- кодированием. 
   unsigned char ReadData[57];//исходная строка 
   unsigned char ResData[76];//закодированная строка 
   unsigned long p=0; 
   unsigned long len=0;       unsigned long SourceLen=0;//длина исходного файла. 
   unsigned long CurResBufferPos=0;//с этой позиции в результирующий буфер заноситься очередная закодированная строка 
   unsigned int j; 
   unsigned char tmpchar; 
  FileData=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); 
   if(FileData==INVALID_HANDLE_VALUE) return 0; 
      do 
   { 
       memset(ReadData,0,57);//заполняем все нулями, для того, чобы если в строке *** будет попытка 
      //залезть за nReadBytes, такое возможно, тк i уведичивается каждый раз на 3, 
      //то лишние байты не будут содержать мусора, а нули не испортят нужные данные 
       ReadFile(FileData,ReadData,57,&nReadBytes,NULL);//прочитали строку 45 байт 
       if (nReadBytes==0) 
       { 
           CloseHandle(FileData); 
           return len;//на тот случай, если размер файла кратен 57. иначе бы мы читали 0 байт, И ЭТОТ НОЛЬ ШЕЛ БЫ ТОЖЕ В ОТСЛЫКУ. 
       } 
       //если же размер файла кратен 57, то он кратен 3, следовательно в коенц закодированного собщение не нужно добавлять знаки равенства. 
              //закодируем ее. 
       j=0; 
       SourceLen+=nReadBytes;// тут мы подсчитываем размер исходного файла. 




********************************************************************
*Вот тут(всё что между звездочек) всё чето глухо некак не пойму понятно что берём по 3 байта в начале а дальше ниче не понятно 
* 
*        for(unsigned int i=0;i<nReadBytes;i+=3)//кодируем по три байта 
       { 
           p=ReadData[i+2]+ReadData[i+1]*256+ReadData[i]*65536;//Тут не ясно зачем умножать на 256 и на 65536 и чемуже будет равно р 
           for(unsigned char i1=0;i1<3;i1++) //Этот цикл вабще не понимаю че делает 
           { 
               tmpchar=p; 
               tmpchar<<=2;//что нам дает этот сдвиг 
               tmpchar>>=2;//что нам дает этот сдвиг 
               ResData[j+3-i1]=tmpchar; 
               p>>=6;//сдвигаем на  6 бит Зачем ? 
           } 
           ResData[j]=p;//в p остались только послдение 6 бит. Их и занесем в результирующую строку. 
           j+=4; //А тут незнаю почему увелич на 4 
Пробовал делать Трасировку не помогло. 
       }* 
*********************************************************************************************





       len+=j+1;//j - сколько байтов в ResData, плюс один байт - конец строки 
              //теперь закодированную строку нужно занести в результирующий буффер 
       if(len<=length)//если есть место в буффере 
       { 
           for(unsigned char i1=0;i1<j;i1++)//нужно перенести j символов 
           { 
               buffer[CurResBufferPos+i1]=base64[ResData[i1]];//-1 тк в uucode нумерация начинается с нуля 
           } 
                      buffer[CurResBufferPos+j]='\n'; 
           CurResBufferPos+=j+1; 
       } 
       else return 0; 
       
   } 
   while(nReadBytes==57); 

   //теперь если размер исходного файла дает при делении на 3 остаток 1, то нужно замениь два последних символа ( а это будут нули) на знаки = 
   //если размер исходного файла дает при делении на 3 остаток 2, то нужно аменить последний символ знаком =. 
   char pad=(3-SourceLen%3)%3;//подсчитываем, сколько знаков = нужно ставить. столь хитрая формула действительно действует, возвращая 0 знаков =, если размер файла кратен 3. 
   while(pad>0) 
   { 
       buffer[CurResBufferPos-1-pad]='=';//последний символ в buffer это '\n', его не нужно менять. меняем символы перед ним. 
       pad--; 
   } 
   CloseHandle(FileData); 
   return len; 
}
 
PM MAIL   Вверх
GrayCardinal
Дата 13.5.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

Репутация: 8
Всего: 58



И куда смотрят модераторы, а ? Перенесите тему плиз, а то мне от "CreateFile" плохо становится. 


--------------------
PM MAIL WWW   Вверх
proman
Дата 15.5.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я не про CreateFile спрашываю а про часть кода которая между звездочками не знаешь че там такое так и скажи незнаю! А то что тебе плохо или хорошо становится от того че ты увидел  я думаю тут большенству по ! 
PM MAIL   Вверх
Spalax
Дата 16.5.2006, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А ты попробуй продебажить и посмотри что куда ..... 
ну а во вторых насколько я знаю в етом форуме обсуждаються вопросы касающиеся программирования под UNIX.
А вот ето 
Код

HANDLE FileData; 
DWORD nReadBytes;

насколько я знаю стиль написания Мелко мягких ну а во вторых мой тебе совет перепиши етот код а то он тупо Виндовый я думаю в std библиотеке найдуться замены ну наподлобии вместьо CreateFile написать там fopen("file_name","w+");
Так что ты подумай 
PM MAIL   Вверх
proman
Дата 16.5.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да я уже все переписал все работает мне разобраться надо только в этом:
Код

Вот тут(всё что между звездочек) всё чето глухо некак не пойму понятно что берём по 3 байта в начале а дальше ниче не понятно 
* 
*        for(unsigned int i=0;i<nReadBytes;i+=3)//кодируем по три байта 
       { 
           p=ReadData[i+2]+ReadData[i+1]*256+ReadData[i]*65536;//Тут не ясно зачем умножать на 256 и на 65536 и чемуже будет равно р 
           for(unsigned char i1=0;i1<3;i1++) //Этот цикл вабще не понимаю че делает 
           { 
               tmpchar=p; 
               tmpchar<<=2;//что нам дает этот сдвиг 
               tmpchar>>=2;//что нам дает этот сдвиг 
               ResData[j+3-i1]=tmpchar; 
               p>>=6;//сдвигаем на  6 бит Зачем ? 
           } 
           ResData[j]=p;//в p остались только послдение 6 бит. Их и занесем в результирующую строку. 
           j+=4; //А тут незнаю почему увелич на 4 
Пробовал делать Трасировку не помогло. 
       }* 
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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