forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Бинарные файлы (http://forum.boolean.name/showthread.php?t=16986)

impersonalis 30.06.2012 01:38

Бинарные файлы
 
Определимся с терминологией. Под бинарным файлом здесь я понимаю такой способ организации (накладывающей особенности на операции чтения/записи) хранения информации в файле, при которой данные представляют собой, по сути дамп памяти. Иными словами, переменная
Код:

int x=123456;
при записи в бинарный файл, занимает ровно 4 байта (т.е. sizeof(int) ) и при открытии целевого файла блокнотом не читается в "человеческом" восприятии.
При записи той же переменной в текстовый (не бинарный) файл, переменная займёт 6 байт (при ASCII-кодировании), каждый из которых будет кодировать одну цифру.
Для Blitz basic: бинарный режим - функции типа ReadInt/WriteInt, текстовый - WriteLine.

Плюсы бинарного режима: возможность сэкономить на памяти и стандартизировать требования к её размерам; возможность сохранять произвольные разнородные данные простой запись куска памяти.
Минусы: возможность потратить память (например, если сохраняемые числа в диапазоне [0..999] для int) и полностью утратить возможность к стандартизации (разные архитектуры и платформы); невозможность сохранять данные простой записью куска памяти (разный порядок байт внутри переменной в зависимости от архитектуры, выравнивания и полный хаос со структурами, беготня, спотыкания и ещё большая непереносимость с директивами #pragma pack; адресация членов объекта через указатели, приводящая к необходимости написания отдельных методов его сохранения).

Получается, что бинарные файлы - это хак. Его переносимость весьма условна.
В то же время, используя текстовый формат, мы по сути, перекладываем обязанности по загрузке\выгрузке (трансляции из файла\в файл ) на функции типа atoi\itoa, работающие на более высоком уровне абстракции: медленнее, но зато без оглядки на "аппаратные" особенности.

Речь даже не только о файлах, но о любой сериализации (ту же структурку по сети кинуть - как кодировать?).

Опрос открытый

Спасибо всем кто осилил излияния и дочитал до конца.
Просьба сильно не пинать, если где-то заблуждаюсь

Mr_F_ 30.06.2012 01:53

Ответ: Бинарные файлы
 
оффлайн данные для игры необходимо хранить в бинарном виде, максимально близком к его представлению в памяти. иное не нужно.
данные, нужные для редактирования в процессе разработке лучше иметь в более универсальном читабельном виде - по крайней мере опыт использования редактируемых данных в бинарном виде у меня негативный.
по сети слать хз, я работу с сетью писал для проекта, в котором протокол был 100% стандартизирован, а скорость критична, так что были бинарные структуры.

jimon 30.06.2012 01:54

Ответ: Бинарные файлы
 
в практическом понимании : бинарный файл это любой файл для редактирования содержимого которого нужно использовать hex (или специфический) редактор

в теоретическом понимании : любой файл = бинарный файл, те это синонимы, но если внутри бинарных файлов данные представлены в текстовой кодировке (ASCII, UTF-8, UTF-16) и тд, то данные называют текстовыми данными, но файл по прежнему бинарный (ведь в utf есть нехитрый такой хак чтобы определить порядок битов в байте, собсно отсюда текст это данные, но никак не файл)

SBJoker 30.06.2012 01:55

Ответ: Бинарные файлы
 
Вообще то при чтении можно задавать порядок байт в слове, тем самым обойти апаратные отличия в кодировании чисел.

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

Обоим типа записи быть, это можно заметить по тому что многие программы имеют как бинарный так и текстовый тип файла. Например DWG и DXF.

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

impersonalis 30.06.2012 01:58

Ответ: Бинарные файлы
 
Цитата:

Сообщение от jimon (Сообщение 231890)
в практическом понимании : бинарный файл это любой файл для редактирования содержимого которого нужно использовать hex (или специфический) редактор

в теоретическом понимании : любой файл = бинарный файл, те это синонимы, но если внутри бинарных файлов данные представлены в текстовой кодировке (ASCII, UTF-8, UTF-16) и тд, то данные называют текстовыми данными, но файл по прежнему бинарный (ведь в utf есть нехитрый такой хак чтобы определить порядок битов в байте, собсно отсюда текст это данные, но никак не файл)

вот специально для таких хитрых я и написал длинное вступление. Спасибо, конечно, за философское уточнение, ещё можно рассказать, что все данные это 0 и 1, а потом спустится ещё ниже - к непрерывным аналоговым сигналам... по теме же - ни слова :(

Randomize 30.06.2012 02:01

Ответ: Бинарные файлы
 
Скажем так. Всё зависит от задачи.

Если данные летят по сети и их реально много, то однозначно бинарные.

Для хранения на диске примерно так:
Если данные достаточно однотипны (например тайловая карта) то тут быстрее и удобнее писать её бинарно.
Ежели данные разнообразные - неравномерные, то проще текстом.
Упакованные данные конечно в бинарном виде.
Данные в которых только текст как ни странно в текстовом виде :-D

Хотя текст и есть бинарные данные, но я твою мысль понял :-)
Кстати, а если в текстовом виде байты чрез запятую написать это текстовый формат или нет? :-D

Сугубо личное мнение.

impersonalis 30.06.2012 02:02

Ответ: Бинарные файлы
 
Цитата:

Сообщение от SBJoker (Сообщение 231891)
Вообще то при чтении можно задавать порядок байт в слове, тем самым обойти апаратные отличия в кодировании чисел.

Пожалуйста, подробнее (цпп).
Опять-таки проблема со структурами остаётся. Можно конечно, сначала всё разбирать до базовых типов, а сохранять уже отдельно их...

Цитата:

Сообщение от Randomize (Сообщение 231893)
Если данные летят по сети и их реально много то однозначно бинарные.

согласен полностью, но с сожалением.

Randomize 30.06.2012 02:08

Ответ: Бинарные файлы
 
Цитата:

Сообщение от impersonalis (Сообщение 231894)
согласен полностью, но с сожалением.

Почему? Текст пожалуй нужен только для наглядности.
Текст это тоже самое только человекочитаемо.

impersonalis 30.06.2012 02:14

Ответ: Бинарные файлы
 
Цитата:

Сообщение от Randomize (Сообщение 231895)
Почему? Текст пожалуй нужен только для наглядности.
Текст это тоже самое только человекочитаемо.

Текст - лишён ряда недостатков, которых не лишены другие типы данных (для jimon: да, я намеренно упрощаю формулировку, чтобы её можно было прочитать в течение дня; да - противопоставление некорректно). Т.е. на одной машине - big-endian, на другой - little-endian, но текстовое представление этого числа - одинаковое (цифры слева-направо по убыванию степеней). Т.е. текст - своеобразный интерфейс.
Организация структур - усмотрение компилятора, директивы управления этим процессом делают код менее портабельным и модульным.

Mr_F_ 30.06.2012 02:26

Ответ: Бинарные файлы
 
Цитата:

Текст - лишён ряда недостатков, которых не лишены другие типы данных (для jimon: да, я намеренно упрощаю формулировку, чтобы её можно было прочитать в течение дня; да - противопоставление некорректно). Т.е. на одной машине - big-endian, на другой - little-endian, но текстовое представление этого числа - одинаковое (цифры слева-направо по убыванию степеней). Т.е. текст - своеобразный интерфейс.
что-то мне подсказывает, что конвертнуть big endian в little endian быстрее, чем парсить человекочитаемый текст.

impersonalis 30.06.2012 02:38

Ответ: Бинарные файлы
 
Цитата:

Сообщение от Mr_F_ (Сообщение 231897)
что-то мне подсказывает, что конвертнуть big endian в little endian быстрее, чем парсить человекочитаемый текст.

безусловно (я об этом писал выше). Осталось только продумать соответствующую отметку в файле. И не забыть её при загрузке учесть. А ещё и код написать, который сам будет определять специфику архитектуры, на которой он выполняется (думаю, это реально, но как, лично я - не знаю).

HolyDel 30.06.2012 02:39

Ответ: Бинарные файлы
 
зависит от задачи

почти всегда хватает бинарных. конфиги там всякие - удел текстовых.

impersonalis 30.06.2012 02:40

Ответ: Бинарные файлы
 
Цитата:

Сообщение от HolyDel (Сообщение 231899)
зависит от задачи

почти всегда хватает бинарных. конфиги там всякие - удел текстовых.

и как обойти проблемы совместимости?

ABTOMAT 30.06.2012 02:42

Ответ: Бинарные файлы
 
Бывает важно экономить.
Бывает важна человекочитаемость/скорость разработки.
бывает подо что-то уже есть готовый велосипед.
Так что "только то" либо "только это" ответить нельзя.

Mr_F_ 30.06.2012 02:47

Ответ: Бинарные файлы
 
а где вообще конкретно такие проблемы с совместимостью встречались?

HolyDel 30.06.2012 02:50

Ответ: Бинарные файлы
 
надуманные проблемы совместимости обойти просто - достаточно их игнорировать :)

little-endian почти везде

impersonalis 30.06.2012 02:55

Ответ: Бинарные файлы
 
Цитата:

Сообщение от Mr_F_ (Сообщение 231903)
а где вообще конкретно такие проблемы с совместимостью встречались?

Что касается структур: http://xydan.livejournal.com/3344.html
На счёт переменных, честно говоря на практике сталкивался только при парсинге одного формата данных (нет гарантии, что числа выворачивались там с каким-то умыслом). Поэтому, не могу 100% гарантировать, а лишь предполагаю и опасаюсь (вспоминая сокеты и htonl/ntohl), что эффект имеет место быть.

jimon 30.06.2012 02:58

Ответ: Бинарные файлы
 
Цитата:

Сообщение от impersonalis (Сообщение 231892)
вот специально для таких хитрых я и написал длинное вступление. Спасибо, конечно, за философское уточнение, ещё можно рассказать, что все данные это 0 и 1, а потом спустится ещё ниже - к непрерывным аналоговым сигналам... по теме же - ни слова :(

хм ? тебя интересует теоретическая сторона ? уже всё сказано
если же интересует практическая сторона но хочешь услышать "технически подкованный ответ который хоть в квн вставляй", так вот, количество букв в алфавите бинарных данных - 255, в ASCII - 127 скажем, те запись в текстовом виде всегда будет требовать больше байт чем в бинарном, а возможность "читать файл в блокноте" довольно спорна если это данные от программы для программ :crazy:

impersonalis 30.06.2012 03:12

Ответ: Бинарные файлы
 
Цитата:

Сообщение от jimon (Сообщение 231908)
хм ? тебя интересует теоретическая сторона ? уже всё сказано
если же интересует практическая сторона но хочешь услышать "технически подкованный ответ который хоть в квн вставляй", так вот, количество букв в алфавите бинарных данных - 255, в ASCII - 127 скажем, те запись в текстовом виде всегда будет требовать больше байт чем в бинарном, а возможность "читать файл в блокноте" довольно спорна если это данные от программы для программ :crazy:

Вероятно, пример с блокнотом всё испортил - каждый 2-ой отписавшийся почему-то рассматривает довод о возможности правки данных в текстовом процессоре.
Меня же более всего волнуют [потенциальные] проблемы переносимости.
Далее: в бинарном алфавите (раз уж мы обратились к теории передачи информации) - 256 символов. 7-битная аськи, канеш справедливо, но подразумевалась более привычная 8-битная, расширенная региональной таблицей. 256=256.
В бинарном виде записывается весь контейнер (напоминаю - речь о числах), а не только значащие биты, т.о. текстовое представление будет эффективней бинарного для всех случаев (см. первый пост):
sizeof(type)>floor(logX(number))+1, где Х - принятая для отображения с\с
для случая int VS 10-base числа от 0 до 999, т.к.
4>floor(2.9...)+1

jimon 30.06.2012 03:26

Ответ: Бинарные файлы
 
impersonalis
так если у тебя число от 0 до 999 то зачем тебе писать его в 4 байта ? хватит 2 байт (short : от 0 до 65535), 2 байта меньше 3 байт необходимых для записи 999

Randomize 30.06.2012 04:07

Ответ: Бинарные файлы
 
Цитата:

Сообщение от Mr_F_ (Сообщение 231903)
а где вообще конкретно такие проблемы с совместимостью встречались?

Уже не актуально, но..
Borland Delphi 7
Скомпилил на 98 винде, перенёс на 2K,XP - получи кракозябры
Скомпилил на 2K,XP, перенёс на 98 - текст не отображается в принципе

Blitz3D тоже показал, что всё с русским не так уж и хорошо. Народ патчил ОС, патчил финальную exe, выносил текст из сорсов (ну это имхо всегда надо делать) и даже полностью заменял блицевский текст на свою реализацию. Таки решили, да.

impersonalis 30.06.2012 12:56

Ответ: Бинарные файлы
 
Всем отписавшимся - большое спасибо: помогли выработать более объективный взгляд на ситуацию!

Dzirt 30.06.2012 13:42

Ответ: Бинарные файлы
 
Для шлифовки баланса геймплея - само собой только текст, сейвы в бинарке.
Но так как 95% файлов в тексте, то ответил только текст....возможно в будующем полностью на текст перейду, так удобней.

pax 30.06.2012 22:58

Ответ: Бинарные файлы
 
Имею для C# свою бинарную сохранялку со структурой типа бинарного JSON и возможностью кодировать кастомные классы (делал для сокращения размера передаваемых данных по сети). Но когда надо использую XML/JSON/TEXT

ffinder 01.07.2012 13:16

Ответ: Бинарные файлы
 
Цитата:

Сообщение от impersonalis (Сообщение 231887)
Получается, что бинарные файлы - это хак. Его переносимость весьма условна.
В то же время, используя текстовый формат
Просьба сильно не пинать, если где-то заблуждаюсь

ну вот как тебя после этого не сильно грызть?
если у бинарного формата четко определен именно... формат, то никаких проблем с его чтением не существует.
есть функции преобразования big endian в little endian и наоборот.
просто сохранять кусок памяти конечно не годится.
но плотно упакованные структуры (без паддинга) лишнюю память не расходуют.

размышления про число 999 уже обсудил jimon.
кстати, "число", а по сути у тебя будет строка, нужно его сконвертировать с число.
так что такой подход не наш метод.

impersonalis 01.07.2012 14:18

Ответ: Бинарные файлы
 
Цитата:

Сообщение от ffinder (Сообщение 232052)
есть функции преобразования big endian в little endian и наоборот.
просто сохранять кусок памяти конечно не годится.
но плотно упакованные структуры (без паддинга) лишнюю память не расходуют.

об этом речь и шла - всё остальное, домыслы, вызванные, вероятно, моей некачественной формулировкой проблемы.
И главное из этого резюме: как реализовать (например, на цпп) грамотное сохранение (например double) в бинарном формате, в том числе - как реализовать код таким образом, чтобы он сам "понимал" необходимо ли использовать преобразование считанного.

Цитата:

Сообщение от ffinder (Сообщение 232052)
но плотно упакованные структуры (без паддинга) лишнюю память не расходуют.

Об этом тоже упоминалось в моих постах.
Тут даже важнее (в рамках проблемы) следующее: представление на разных компиляторах (и настройках) различаются, и потому если не убирать выравнивания то тупо переслать кусок памяти между программами не удастся.

jimon 01.07.2012 14:45

Ответ: Бинарные файлы
 
Цитата:

Сообщение от impersonalis (Сообщение 232060)
представление на разных компиляторах (и настройках) различаются, и потому если не убирать выравнивания то тупо переслать кусок памяти между программами не удастся.

у каждого компилятора есть свой ABI (Application Binary Interface), иногда он задаётся самим языком, а иногда не задаётся :crazy: так вот в C и C++ он не определяется стандартами, отсюда твои проблемы ?

ps. если да, то советую глянуть как у нас устроен вызов функций - везде юзается какое нибудь заранее обговоренное соглашение о вызове ( stdcall и прочие : http://en.wikipedia.org/wiki/X86_calling_conventions ), собственно если вызывающий код (например в другой библиотеке) не знает о соглашении то ничего не получится, вот так же делается и с структурами - надо кидать структуры между программами с разным ABI напрямую ? обговаривай соглашение и всё, зачастую выравнивание на 4 обговорить и хватит, самое сложное - это указатель на метод, он везде разный размер имеет (от 8 до 20 байт)

impersonalis 01.07.2012 15:04

Ответ: Бинарные файлы
 
Цитата:

Сообщение от jimon (Сообщение 232062)
у каждого компилятора есть свой ABI (Application Binary Interface), иногда он задаётся самим языком, а иногда не задаётся :crazy: так вот в C и C++ он не определяется стандартами, отсюда твои проблемы ?

ps. если да, то советую глянуть как у нас устроен вызов функций - везде юзается какое нибудь заранее обговоренное соглашение о вызове ( stdcall и прочие : http://en.wikipedia.org/wiki/X86_calling_conventions ), собственно если вызывающий код (например в другой библиотеке) не знает о соглашении то ничего не получится, вот так же делается и с структурами - надо кидать структуры между программами с разным ABI напрямую ? обговаривай соглашение и всё, зачастую выравнивание на 4 обговорить и хватит, самое сложное - это указатель на метод, он везде разный размер имеет (от 8 до 20 байт)

УРА! именно это я и хотел услышать! В следующий раз буду задавать вопрос менее обтекаемо. Собственно, я это уже выжал из треда (хотя если б не тупил и задал вопрос нормально - то получил ответ сразу же :( ).
И именно поэтому я рассуждал о костыле в виде текстового представления.
p.s.: да проблемы с соглашением вызова как-то были - тема была изучена в необходимом объёме

Теперь просветите: насколько непопулярны системы с big-endian? Стоит ли опасаться непереносимости сохранённых чисел?

jimon 01.07.2012 15:29

Ответ: Бинарные файлы
 
Цитата:

Сообщение от impersonalis (Сообщение 232063)
УРА! именно это я и хотел услышать! В следующий раз буду задавать вопрос менее обтекаемо. Собственно, я это уже выжал из треда (хотя если б не тупил и задал вопрос нормально - то получил ответ сразу же :( ).
И именно поэтому я рассуждал о костыле в виде текстового представления.
p.s.: да проблемы с соглашением вызова как-то были - тема была изучена в необходимом объёме

Теперь просветите: насколько непопулярны системы с big-endian? Стоит ли опасаться непереносимости сохранённых чисел?

если тебе не надо писать под PowerPC, SPARC и MIPS, то забей


Часовой пояс GMT +4, время: 10:07.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot