[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запись данных в файл в бинарном виде и их чтение
Gilorn
Приветствую.
Месяц назад заинтересовался программированием, посоветовали начать с PHP, решил попробовать, скачал с торрентов видео курс от "Специалиста" по ПХП 5.3, с основами разобрался, в общем вроде всё хорошо.
Но повис на вопросе бинарных данных, который там не разбирается особо (кроме бинарных операторов), и интернет не особо помог, нашел только [1], [2] и [3], и вроде бы всё понятно (хотя местами и не очень), но ответа на свой вопрос я не нашел smile.gif
А вопрос в следующем. Мне интересно как в бинарных форматах хранят данные? Как эти данные читать, как эти данные писать (если допустим свой формат делаешь) на PHP?
Поясню. Например, имеем формат реплеев игры Warcraft 3, по которому есть неофициальная документация, например в начале написано описание заголовка формата:
Цитата

===============================================================================
2.0 [Header]
===============================================================================

The replay file consist of a header followed by a variable number of compressed
data blocks. The header has the following format:

offset | size/type | Description
-------+-----------+-----------------------------------------------------------
0x0000 | 28 chars  | zero terminated string "Warcraft III recorded game\0x1A\0"
0x001c |  1 dword  | fileoffset of first compressed data block (header size)
      |          |  0x40 for WarCraft III with patch <= v1.06
      |          |  0x44 for WarCraft III patch >= 1.07 and TFT replays
0x0020 |  1 dword  | overall size of compressed file
0x0024 |  1 dword  | replay header version:
      |          |  0x00 for WarCraft III with patch <= 1.06
      |          |  0x01 for WarCraft III patch >= 1.07 and TFT replays
0x0028 |  1 dword  | overall size of decompressed data (excluding header)
0x002c |  1 dword  | number of compressed data blocks in file
...


1. Как это анализировать? Например offset. Не пойму как его воспринимать. Ну, я так понимаю, адрес/смещение. Ну а что дальше? Что мне с этой информацией делать? Как она мне поможет, предположим, для написания моего парсера этого формата?
По size/type ещё могу предположить, что описывается размер данных, и с ним в принципе всё более менее понятно (хотя не очень понятно, как воспринимать что-нить типа 2 dword или 10 dword или 5 word, если такие вариации вообще возможны).
И, что так же интересно, как составители такого рода документаций по всяким форматам, определяют эти самые offset'ы и size/type'ы? Просто не очень понятно как они это выглядывают, если например открыть в блокноте бинарный файл smile.gif

2. Как это читать на PHP? fopen, fread я полагаю... но как это потом перевести в читаемый/наглядный вид (т.е. из бинарного в строковой)? hex to str? bin to str? hex to bin to str? bin to hex to dec to str? pack..? unpack..? base_convert? ...? Совсем запутался.

3. Предположим, я хочу сделать свой бинарный формат, в котором хочу что-нибудь хранить в разном (в сжатом, в том числе, имеется в виду) виде.
И предположим имею некие начальные данные:
$str_header = 'My mega format';
$str_ver_major = 1;
$str_ver_minor = 0;
$str_data = gzcompress("Lorem Ipsum");
$str_data2 = 'bla bla';

Вопрос: как это можно всё записать в бинарном виде в файл, и потом соответственно прочитать эти бинарные данные из файла чтобы получить эти исходные данные (в массиве, например)? Пробовал самостоятельно, но запутался во всех этих hex to str/bin to str/dec to bin to hex to str/pack/unpack/base_convert/...

Спасибо что потратили время на прочтение, надеюсь поможете с (базовой, хотя бы) теорией, и с примерами (с 3-м пунктом, по нему быть может пойму как быть с 1-м и 2-м), кому не сложно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.