На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Кодирование файлов, алгоритм TEA , помогите найти ошибки в преамбуле
    ОC: WinXP pro
    Компилятор: Borland C/C++ 3.0, VC++ 6.0
    что-то ругается VC++ 6 не хочет он открывать файлики..
    а C/C++ 3.0 неправильно кодирует, что-то в итоге получается, что кодированный больше чем исходный файл,
    помогите найти ошибки в main, алгоритм кодирования, реализован правильно.
    Смысл заключается в том, что мы читаем из файла каждый раз по 8 байт, приводим к к типу long*, кодируем и записываем во второй файл итд пока не достигнем конца файла.
    Вот код:
    ExpandedWrap disabled
      #include <conio.h>
      #include <iostream.h>
      #include <stdio.h>
      #include <stdlib.h>
      #define size 8
      void code (long*,long*);
      void decode (long*,long*);
      void main()
      {
         FILE *in,*out;
        char buf[size];
        char ifile[100],ofile[100];
        int act,ans;
        cout <<"Choose the operation:"<<endl<<"1-Encode<<2-Decode:"<<endl;
        ans=getchar();
        if (ans == '1' || ans == '2')
        {
            cout <<"Insert input file:"<<endl;
            scanf ("%s",ifile);
        }
        else {
        cout <<"Error! Retry later";
        getch();
        exit(1);
        }
        if (in == NULL)
          {
              printf ("File %s is not exist!\n",ifile);
              getch();
              exit(1);
          }
        cout <<"Insert output file:"<<endl;
        scanf ("%s",ofile);
        in=fopen(ifile,"r+b");
        int notexist=0;
          if ((out=fopen(ofile,"rb")) == NULL)
          {
              notexist=1;
          }
          if (notexist)
          {
              out=fopen(ofile,"w+b");
          }
          else
          {
              printf ("Delete %s, Y/N?",ofile);
              int ans2=getchar();
              if (ans2 == 'Y' || ans2 == 'y')
                  out=fopen(ofile,"w+b");
              else exit(1);
          }
        //
        long k[]= {1,1,1,1},*pl;
        do
        {
            act=fread(buf,sizeof(char),size,in);
            pl=(long*)buf;
            if (ans == '1')
                code(pl, k);
            else decode(pl, k);
            fwrite(pl,sizeof(long),act,out);
        }
        while (act == size);
        fclose (in);
        fclose (out);
        getch();  
      }
       
      void decode(long* v, long* k)
      {
      unsigned long n=32, sum=0, y=v[0], z=v[1],
      delta=0x9e3779b9;
      sum=delta<<5;
      /* start cycle */
      while (n-->0) {
      z-= ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]);
      y-= ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]);
      sum-=delta ; }
      /* end cycle */
      v[0]=y ; v[1]=z ;
      }
      void code(long* v, long* k)
      {
      unsigned long y=v[0],z=v[1], sum=0, /* set up */
      delta=0x9e3779b9, /* a key schedule constant */
      n=32 ;
      while (n-->0) { /* basic cycle start */
      sum += delta ;
      y += ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) ;
      z += ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]) ;
      } /* end cycle */
      v[0]=y ; v[1]=z ;
      }
      fwrite(pl,sizeof(long),act,out);
      - читаешь char-ы, а пишешь в long-ах,
      не учитывается, что при кодировании размер данных меняется в 2 раза.
        nvm
        Цитата
        читаешь char-ы, а пишешь в long-ах

        дело в том, что я читаю последовательность из 8 char и преобразую его в 2 long, который впоследстии кодируется и записывается как long....а насчет декодирования, там вероятно пока неправильно, потому что считываем фактически long и пишем также long.
        Но вопрос в том, что как хотя бы правильно файл кодировать?
        Попробуй откомпилить, что-то у меня вообще не пишет теперь в output file ничего.
          Читаешь 8 байт:
          Цитата
          act=fread(buf,sizeof(char),size,in);
          act равно 8
          Теперь пишешь act long'ов(т.е. 8*sizeof(long) = 32 байтов)
          Цитата
          fwrite(pl,sizeof(long),act,out);

          Это правильно? Из 8 байтов делать 32 байта. И при этом 24 из этих байтов - мусор.
            trainer
            намек понял, исправил, теперь все работает только для файлов кратных 8, попозже еще условие добавлю, что если act<6 то тогда дописываем в буфер нули и их же после декодирования отнимаем, а то в данный момент занят...
            вот так нужно исправить:
            ExpandedWrap disabled
               fwrite(buf,sizeof(char),act,out);
              Если кому интересна работа данного алгоритма, то я справился с данной садачей под DOS и Win32. Если что, пишите...
                Скиньте, пожалуйста, исправленную программу? Мне сегодня она нужна
                Сообщение отредактировано: Aleksey -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0250 ]   [ 16 queries used ]   [ Generated: 2.05.24, 12:42 GMT ]