![]() |
Бинарные файлы
Определимся с терминологией. Под бинарным файлом здесь я понимаю такой способ организации (накладывающей особенности на операции чтения/записи) хранения информации в файле, при которой данные представляют собой, по сути дамп памяти. Иными словами, переменная
Код:
int x=123456; При записи той же переменной в текстовый (не бинарный) файл, переменная займёт 6 байт (при ASCII-кодировании), каждый из которых будет кодировать одну цифру. Для Blitz basic: бинарный режим - функции типа ReadInt/WriteInt, текстовый - WriteLine. Плюсы бинарного режима: возможность сэкономить на памяти и стандартизировать требования к её размерам; возможность сохранять произвольные разнородные данные простой запись куска памяти. Минусы: возможность потратить память (например, если сохраняемые числа в диапазоне [0..999] для int) и полностью утратить возможность к стандартизации (разные архитектуры и платформы); невозможность сохранять данные простой записью куска памяти (разный порядок байт внутри переменной в зависимости от архитектуры, выравнивания и полный хаос со структурами, беготня, спотыкания и ещё большая непереносимость с директивами #pragma pack; адресация членов объекта через указатели, приводящая к необходимости написания отдельных методов его сохранения). Получается, что бинарные файлы - это хак. Его переносимость весьма условна. В то же время, используя текстовый формат, мы по сути, перекладываем обязанности по загрузке\выгрузке (трансляции из файла\в файл ) на функции типа atoi\itoa, работающие на более высоком уровне абстракции: медленнее, но зато без оглядки на "аппаратные" особенности. Речь даже не только о файлах, но о любой сериализации (ту же структурку по сети кинуть - как кодировать?). Опрос открытый Спасибо всем кто осилил излияния и дочитал до конца. Просьба сильно не пинать, если где-то заблуждаюсь |
Ответ: Бинарные файлы
оффлайн данные для игры необходимо хранить в бинарном виде, максимально близком к его представлению в памяти. иное не нужно.
данные, нужные для редактирования в процессе разработке лучше иметь в более универсальном читабельном виде - по крайней мере опыт использования редактируемых данных в бинарном виде у меня негативный. по сети слать хз, я работу с сетью писал для проекта, в котором протокол был 100% стандартизирован, а скорость критична, так что были бинарные структуры. |
Ответ: Бинарные файлы
в практическом понимании : бинарный файл это любой файл для редактирования содержимого которого нужно использовать hex (или специфический) редактор
в теоретическом понимании : любой файл = бинарный файл, те это синонимы, но если внутри бинарных файлов данные представлены в текстовой кодировке (ASCII, UTF-8, UTF-16) и тд, то данные называют текстовыми данными, но файл по прежнему бинарный (ведь в utf есть нехитрый такой хак чтобы определить порядок битов в байте, собсно отсюда текст это данные, но никак не файл) |
Ответ: Бинарные файлы
Вообще то при чтении можно задавать порядок байт в слове, тем самым обойти апаратные отличия в кодировании чисел.
Увлечение переносимостью и читабельностью файлов привело к созданию монстров типа XML, на парсинг которых уходит огромное количество процессорного времени. Обоим типа записи быть, это можно заметить по тому что многие программы имеют как бинарный так и текстовый тип файла. Например DWG и DXF. А вообще тип записи выбирается исходя из конкретных задач. Например конфигурационные файлы, для которых скорее всего небудет создан редактор, лучше делать текстовыми для правки их любым текстовым процессором. А например файлы сохранения игры, лучше реализуются бинарным способом. |
Ответ: Бинарные файлы
Цитата:
|
Ответ: Бинарные файлы
Скажем так. Всё зависит от задачи.
Если данные летят по сети и их реально много, то однозначно бинарные. Для хранения на диске примерно так: Если данные достаточно однотипны (например тайловая карта) то тут быстрее и удобнее писать её бинарно. Ежели данные разнообразные - неравномерные, то проще текстом. Упакованные данные конечно в бинарном виде. Данные в которых только текст как ни странно в текстовом виде :-D Хотя текст и есть бинарные данные, но я твою мысль понял :-) Кстати, а если в текстовом виде байты чрез запятую написать это текстовый формат или нет? :-D Сугубо личное мнение. |
Ответ: Бинарные файлы
Цитата:
Опять-таки проблема со структурами остаётся. Можно конечно, сначала всё разбирать до базовых типов, а сохранять уже отдельно их... Цитата:
|
Ответ: Бинарные файлы
Цитата:
Текст это тоже самое только человекочитаемо. |
Ответ: Бинарные файлы
Цитата:
Организация структур - усмотрение компилятора, директивы управления этим процессом делают код менее портабельным и модульным. |
Ответ: Бинарные файлы
Цитата:
|
Ответ: Бинарные файлы
Цитата:
|
Ответ: Бинарные файлы
зависит от задачи
почти всегда хватает бинарных. конфиги там всякие - удел текстовых. |
Ответ: Бинарные файлы
Цитата:
|
Ответ: Бинарные файлы
Бывает важно экономить.
Бывает важна человекочитаемость/скорость разработки. бывает подо что-то уже есть готовый велосипед. Так что "только то" либо "только это" ответить нельзя. |
Ответ: Бинарные файлы
а где вообще конкретно такие проблемы с совместимостью встречались?
|
Ответ: Бинарные файлы
надуманные проблемы совместимости обойти просто - достаточно их игнорировать :)
little-endian почти везде |
Ответ: Бинарные файлы
Цитата:
На счёт переменных, честно говоря на практике сталкивался только при парсинге одного формата данных (нет гарантии, что числа выворачивались там с каким-то умыслом). Поэтому, не могу 100% гарантировать, а лишь предполагаю и опасаюсь (вспоминая сокеты и htonl/ntohl), что эффект имеет место быть. |
Ответ: Бинарные файлы
Цитата:
если же интересует практическая сторона но хочешь услышать "технически подкованный ответ который хоть в квн вставляй", так вот, количество букв в алфавите бинарных данных - 255, в ASCII - 127 скажем, те запись в текстовом виде всегда будет требовать больше байт чем в бинарном, а возможность "читать файл в блокноте" довольно спорна если это данные от программы для программ :crazy: |
Ответ: Бинарные файлы
Цитата:
Меня же более всего волнуют [потенциальные] проблемы переносимости. Далее: в бинарном алфавите (раз уж мы обратились к теории передачи информации) - 256 символов. 7-битная аськи, канеш справедливо, но подразумевалась более привычная 8-битная, расширенная региональной таблицей. 256=256. В бинарном виде записывается весь контейнер (напоминаю - речь о числах), а не только значащие биты, т.о. текстовое представление будет эффективней бинарного для всех случаев (см. первый пост): sizeof(type)>floor(logX(number))+1, где Х - принятая для отображения с\с для случая int VS 10-base числа от 0 до 999, т.к. 4>floor(2.9...)+1 |
Ответ: Бинарные файлы
impersonalis
так если у тебя число от 0 до 999 то зачем тебе писать его в 4 байта ? хватит 2 байт (short : от 0 до 65535), 2 байта меньше 3 байт необходимых для записи 999 |
Ответ: Бинарные файлы
Цитата:
Borland Delphi 7 Скомпилил на 98 винде, перенёс на 2K,XP - получи кракозябры Скомпилил на 2K,XP, перенёс на 98 - текст не отображается в принципе Blitz3D тоже показал, что всё с русским не так уж и хорошо. Народ патчил ОС, патчил финальную exe, выносил текст из сорсов (ну это имхо всегда надо делать) и даже полностью заменял блицевский текст на свою реализацию. Таки решили, да. |
Ответ: Бинарные файлы
Всем отписавшимся - большое спасибо: помогли выработать более объективный взгляд на ситуацию!
|
Ответ: Бинарные файлы
Для шлифовки баланса геймплея - само собой только текст, сейвы в бинарке.
Но так как 95% файлов в тексте, то ответил только текст....возможно в будующем полностью на текст перейду, так удобней. |
Ответ: Бинарные файлы
Имею для C# свою бинарную сохранялку со структурой типа бинарного JSON и возможностью кодировать кастомные классы (делал для сокращения размера передаваемых данных по сети). Но когда надо использую XML/JSON/TEXT
|
Ответ: Бинарные файлы
Цитата:
если у бинарного формата четко определен именно... формат, то никаких проблем с его чтением не существует. есть функции преобразования big endian в little endian и наоборот. просто сохранять кусок памяти конечно не годится. но плотно упакованные структуры (без паддинга) лишнюю память не расходуют. размышления про число 999 уже обсудил jimon. кстати, "число", а по сути у тебя будет строка, нужно его сконвертировать с число. так что такой подход не наш метод. |
Ответ: Бинарные файлы
Цитата:
И главное из этого резюме: как реализовать (например, на цпп) грамотное сохранение (например double) в бинарном формате, в том числе - как реализовать код таким образом, чтобы он сам "понимал" необходимо ли использовать преобразование считанного. Цитата:
Тут даже важнее (в рамках проблемы) следующее: представление на разных компиляторах (и настройках) различаются, и потому если не убирать выравнивания то тупо переслать кусок памяти между программами не удастся. |
Ответ: Бинарные файлы
Цитата:
ps. если да, то советую глянуть как у нас устроен вызов функций - везде юзается какое нибудь заранее обговоренное соглашение о вызове ( stdcall и прочие : http://en.wikipedia.org/wiki/X86_calling_conventions ), собственно если вызывающий код (например в другой библиотеке) не знает о соглашении то ничего не получится, вот так же делается и с структурами - надо кидать структуры между программами с разным ABI напрямую ? обговаривай соглашение и всё, зачастую выравнивание на 4 обговорить и хватит, самое сложное - это указатель на метод, он везде разный размер имеет (от 8 до 20 байт) |
Ответ: Бинарные файлы
Цитата:
И именно поэтому я рассуждал о костыле в виде текстового представления. Теперь просветите: насколько непопулярны системы с big-endian? Стоит ли опасаться непереносимости сохранённых чисел? |
Ответ: Бинарные файлы
Цитата:
|
Часовой пояс GMT +4, время: 10:07. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot