Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.227.228.95] |
|
Сообщ.
#1
,
|
|
|
ОC: WinXP pro
Компилятор: Borland C/C++ 3.0, VC++ 6.0 что-то ругается VC++ 6 не хочет он открывать файлики.. а C/C++ 3.0 неправильно кодирует, что-то в итоге получается, что кодированный больше чем исходный файл, помогите найти ошибки в main, алгоритм кодирования, реализован правильно. Смысл заключается в том, что мы читаем из файла каждый раз по 8 байт, приводим к к типу long*, кодируем и записываем во второй файл итд пока не достигнем конца файла. Вот код: #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 ; } |
Сообщ.
#2
,
|
|
|
fwrite(pl,sizeof(long),act,out);
- читаешь char-ы, а пишешь в long-ах, не учитывается, что при кодировании размер данных меняется в 2 раза. |
Сообщ.
#3
,
|
|
|
nvm
Цитата читаешь char-ы, а пишешь в long-ах дело в том, что я читаю последовательность из 8 char и преобразую его в 2 long, который впоследстии кодируется и записывается как long....а насчет декодирования, там вероятно пока неправильно, потому что считываем фактически long и пишем также long. Но вопрос в том, что как хотя бы правильно файл кодировать? Попробуй откомпилить, что-то у меня вообще не пишет теперь в output file ничего. |
Сообщ.
#4
,
|
|
|
Читаешь 8 байт:
Цитата act равно 8 act=fread(buf,sizeof(char),size,in); Теперь пишешь act long'ов(т.е. 8*sizeof(long) = 32 байтов) Цитата fwrite(pl,sizeof(long),act,out); Это правильно? Из 8 байтов делать 32 байта. И при этом 24 из этих байтов - мусор. |
Сообщ.
#5
,
|
|
|
trainer
намек понял, исправил, теперь все работает только для файлов кратных 8, попозже еще условие добавлю, что если act<6 то тогда дописываем в буфер нули и их же после декодирования отнимаем, а то в данный момент занят... вот так нужно исправить: fwrite(buf,sizeof(char),act,out); |
Сообщ.
#6
,
|
|
|
Если кому интересна работа данного алгоритма, то я справился с данной садачей под DOS и Win32. Если что, пишите...
|
Сообщ.
#7
,
|
|
|
Скиньте, пожалуйста, исправленную программу? Мне сегодня она нужна
|