За последние 24 часа нас посетили 19422 программиста и 1605 роботов. Сейчас ищут 938 программистов ...

Запись данных в файл в бинарном виде и их чтение

Тема в разделе "PHP для новичков", создана пользователем Gilorn, 11 фев 2015.

  1. Gilorn

    Gilorn Новичок

    С нами с:
    11 фев 2015
    Сообщения:
    1
    Симпатии:
    0
    Приветствую.
    Месяц назад заинтересовался программированием, посоветовали начать с PHP, решил попробовать, скачал с торрентов видео курс от "Специалиста" по ПХП 5.3, с основами разобрался, в общем вроде всё хорошо.
    Но повис на вопросе бинарных данных, который там не разбирается особо (кроме бинарных операторов), и интернет не особо помог, нашел только [1], [2] и [3], и вроде бы всё понятно (хотя местами и не очень), но ответа на свой вопрос я не нашел :)
    А вопрос в следующем. Мне интересно как в бинарных форматах хранят данные? Как эти данные читать, как эти данные писать (если допустим свой формат делаешь) на PHP?
    Поясню. Например, имеем формат реплеев игры Warcraft 3, по которому есть неофициальная документация, например в начале написано описание заголовка формата:
    1. Как это анализировать? Например offset. Не пойму как его воспринимать. Ну, я так понимаю, адрес/смещение. Ну а что дальше? Что мне с этой информацией делать в рамках PHP? Как она мне поможет, предположим, для написания моего парсера этого формата?
    По size/type ещё могу предположить, что описывается размер данных, и с ним в принципе всё более менее понятно (хотя не очень понятно, как воспринимать что-нить типа 2 dword или 10 dword или 5 word, если такие вариации вообще возможны).
    И, что так же интересно, как составители такого рода документаций по всяким форматам, определяют эти самые offset'ы и size/type'ы? Просто не очень понятно как они это выглядывают, если например открыть в блокноте бинарный файл (или используются специальные тулзы?) :)

    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';

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

    Спасибо что потратили время на прочтение, надеюсь поможете с (базовой, хотя бы) теорией, и с примерами (с 3-м пунктом, по нему быть может пойму как быть с 1-м и 2-м), кому не сложно.
    Прошу заметить, запись бинарных данных в MySQL меня не интересует. Мне конкретно важно понять именно как хранить это дело в файлах, интересно понять как создаются вообще эти бинарные форматы файлов и как в них лежат данные и как их писать/читать средствами PHP.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну это позиция от начала.

    соотв 1c это 28, т.е. учитывая, что тут считают с нуля, а оффсеты традиционно пишут гексом, то с 29-го байта длинной в один дворд будет указана позиция первого сжатого блока.


    указано, чем отличаются версии реплеев.

    педивикия тебе поможет http://en.wikipedia.org/wiki/Word_(computer_architecture)
    скорее всего это 32 бита.

    если там есть строки, то никак. Если там нет строк, то не понятно что вы хотите. =) Это ж бинарные данные. Переводите, как указано в спеках.

    надо осваивать массивы

    ну видимо надо разработать некую структуру этого файла, а т.к. присутствуют сжатые данные, то не стоит опираться на ключевые символы и последовательности, и видимо нужно указывать длины блоков. Последовательность блоков и некие управляющие "слова" для вашего формата тоже придётся придумать самому.
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Зря. Им ты и закончишь. Начиная с пхп ты подписал себе приговор.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты чего это такой свирепый? =) а как же пхп->джава?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Никак. Джава->пхп да, в обратку нет. За редчайшими исключениями.