Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Размер файла, каков он на самом деле =) (https://forum.antichat.xyz/showthread.php?t=159644)

VERte][ 28.11.2009 02:23

Размер файла, каков он на самом деле =)
 
Собственно сел тут писякать программу шифрующую/расшифровывающую файлы по алгоритму aes. Вроде как все функции написал, прогнал тест на 128 битах текста, все тип-топ, ещё пару тестов из текстов слепленных из первого, все пашет. Загоняю текстик побольше, там какое-то интервью артиста, и получаю на выходе понятное дело хню - после шифровки+расшифровки получаю только часть текста, причем размер зашифрованного текста не удовлетворяет мои представлениям о том каким он должен быть, я естественно схватился за отладчик, и вот что получил, ещё на обработки исходного текста:

http://s53.radikal.ru/i140/0911/1c/94f1f7a515b6t.jpg

как видите текст, который есть в блокнотике не совпадает с тем что VS получила, концы различаются.
Далее ещё веселее - смотрю я на размер исходного текста, на то что выдает студия и на то сколько байт я таки считал на обработке текста, получаю такую вещь:

1) что думает студия
http://i054.radikal.ru/0911/85/0682e033f60ct.jpg

2) что думает винда
http://i032.radikal.ru/0911/9b/5b3981bee9cbt.jpg

3) и что я думаю (складываем count и writed)
http://s58.radikal.ru/i161/0911/42/17bacc7b4377t.jpg


И вот ещё что: в самом конце считывание остановилось где надо, появилась буковка "я", которая как я понимаю обозначила конец файла, ибо это 0xFF, что впринципе и возвращает ifstream::get() при достижении конца файла.

http://i014.radikal.ru/0911/c3/59be94406d8bt.jpg

Так вот кто сталкивался с такими проблемами "размера файла", и если вдруг сталкивался, то как с ними бороться или с чем хотя бы они могут быть связаны? Использовал я для обработки данных файла функции класса fstream: put, get, eof.
И ещё как оказалось, функция get не считывает например 0x1A, возвращая конец файла, поэтому то у меня и терялась часть файла при шифровании-расшифровании, вот сижу думаю какие функции использовать чтоб именно считывать все байты из файла без разбора, может кто что подскажет? (пока надумываю обратиться в сторону сишного fread, и все переписывать =( )

.ATK 28.11.2009 02:51

Дай исходничок, на досуге повтыкаю...

VERte][ 28.11.2009 03:43

хехе, исходник, там щас черт ногу сломит ну в принципе вот http://stream.ifolder.ru/15195470, завтра если щас и с fread, fwrite не будет работать, выложу более менее норм обработанный, щас стоит только смотреть на то каким образом определяется размер файлов в студии при использовании класса fstream

зы. впринципе fread, fwrite более результативны, но fread также вылетает встретив байт 0x1A, я в замешательстве =\

pss с 0x1a все ясно, это маркер конца файла, избежать его можно считывая в бин.режиме. В принципе все робит теперь, но все же вопрос о размере файла при работе с fstream остается
вот работающий исходник http://stream.ifolder.ru/15195870, осталось только это все заоптимайзить, ещё работы на день =)

Forcer 28.11.2009 04:17

Тоже недавно столкнулся с таким поведением(непонятные байты из потока читаются). Ubuntu/g++. После долгого перерыва решил написать что-то на С++ - это оказалась лаба по криптографии - шифровщик файлов на основе простой сети Фейстеля. Возникла такая же проблема. Подумал что совсем забыл с++(не притрагивался года полтора - писал на java только) - погуглил, попробовал некоторые варианты - ничего не работало. После этого окончательно разочаровался в с++ как в языке программирования - слишком много времени на такую банальщину потратил и все безрезультатно - это просто позор для языка. Взял и переписал все на java - на это ушло времени в разы меньше чем гугление ошибки на с++. Все сразу заработало. На c# я уверен все так же реализуется без проблем.

ErrorNeo 28.11.2009 04:49

я на дельфе подобную фигню писал - пользовал посимвольное считывание, т.к. все остальные функции запарываются на отдельных спец\нечитаемых символах, если открывать файл как textfile.

хотя если открывать просто как file и использовать blockread - то вроде норм, хотя обрабатывать текст при этом не пробовал. Наверное норм будет, хз

как в СИ не знаю, но сложности с этим видимо есть везде

slesh 28.11.2009 12:00

вообще в Си есть такая классная фишка - тип char является числом со знаком.
типа
Код:

        char m = 0x99;
        char n = 0x20;
       
        if (n > m)
        {
                printf("n>m");
        }

выдаст n>m потому m будет считаться отрицательным и по этому при расчетах могут получаться неправильные значения. так что нужно всё считать в unsigned char

А на счет считывания файлов, то юзай функции бинорной работы с файлом или апишки - через CreateFile откроеш файл. через GetFileSize получиш размер и через ReadFile считаеш скока нужно.

Forcer 29.11.2009 00:31

2slesh
интересовал чистый c++. не си, не api.


Время: 09:27