Собственно сел тут писякать программу шифрующую/расшифровывающую файлы по алгоритму aes. Вроде как все функции написал, прогнал тест на 128 битах текста, все тип-топ, ещё пару тестов из текстов слепленных из первого, все пашет. Загоняю текстик побольше, там какое-то интервью артиста, и получаю на выходе понятное дело хню - после шифровки+расшифровки получаю только часть текста, причем размер зашифрованного текста не удовлетворяет мои представлениям о том каким он должен быть, я естественно схватился за отладчик, и вот что получил, ещё на обработки исходного текста: как видите текст, который есть в блокнотике не совпадает с тем что VS получила, концы различаются. Далее ещё веселее - смотрю я на размер исходного текста, на то что выдает студия и на то сколько байт я таки считал на обработке текста, получаю такую вещь: 1) что думает студия 2) что думает винда 3) и что я думаю (складываем count и writed) И вот ещё что: в самом конце считывание остановилось где надо, появилась буковка "я", которая как я понимаю обозначила конец файла, ибо это 0xFF, что впринципе и возвращает ifstream::get() при достижении конца файла. Так вот кто сталкивался с такими проблемами "размера файла", и если вдруг сталкивался, то как с ними бороться или с чем хотя бы они могут быть связаны? Использовал я для обработки данных файла функции класса fstream: put, get, eof. И ещё как оказалось, функция get не считывает например 0x1A, возвращая конец файла, поэтому то у меня и терялась часть файла при шифровании-расшифровании, вот сижу думаю какие функции использовать чтоб именно считывать все байты из файла без разбора, может кто что подскажет? (пока надумываю обратиться в сторону сишного fread, и все переписывать =( )
хехе, исходник, там щас черт ногу сломит ну в принципе вот http://stream.ifolder.ru/15195470, завтра если щас и с fread, fwrite не будет работать, выложу более менее норм обработанный, щас стоит только смотреть на то каким образом определяется размер файлов в студии при использовании класса fstream зы. впринципе fread, fwrite более результативны, но fread также вылетает встретив байт 0x1A, я в замешательстве =\ pss с 0x1a все ясно, это маркер конца файла, избежать его можно считывая в бин.режиме. В принципе все робит теперь, но все же вопрос о размере файла при работе с fstream остается вот работающий исходник http://stream.ifolder.ru/15195870, осталось только это все заоптимайзить, ещё работы на день =)
Тоже недавно столкнулся с таким поведением(непонятные байты из потока читаются). Ubuntu/g++. После долгого перерыва решил написать что-то на С++ - это оказалась лаба по криптографии - шифровщик файлов на основе простой сети Фейстеля. Возникла такая же проблема. Подумал что совсем забыл с++(не притрагивался года полтора - писал на java только) - погуглил, попробовал некоторые варианты - ничего не работало. После этого окончательно разочаровался в с++ как в языке программирования - слишком много времени на такую банальщину потратил и все безрезультатно - это просто позор для языка. Взял и переписал все на java - на это ушло времени в разы меньше чем гугление ошибки на с++. Все сразу заработало. На c# я уверен все так же реализуется без проблем.
я на дельфе подобную фигню писал - пользовал посимвольное считывание, т.к. все остальные функции запарываются на отдельных спец\нечитаемых символах, если открывать файл как textfile. хотя если открывать просто как file и использовать blockread - то вроде норм, хотя обрабатывать текст при этом не пробовал. Наверное норм будет, хз как в СИ не знаю, но сложности с этим видимо есть везде
вообще в Си есть такая классная фишка - тип char является числом со знаком. типа Code: char m = 0x99; char n = 0x20; if (n > m) { printf("n>m"); } выдаст n>m потому m будет считаться отрицательным и по этому при расчетах могут получаться неправильные значения. так что нужно всё считать в unsigned char А на счет считывания файлов, то юзай функции бинорной работы с файлом или апишки - через CreateFile откроеш файл. через GetFileSize получиш размер и через ReadFile считаеш скока нужно.