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)

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, время: 13:24.

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