Запись в бинарный файл данных со структурой

Статус
В этой теме нельзя размещать новые ответы.

zip111

Новичок
Запись в бинарный файл данных со структурой

Добрый день всем.

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

Суть задачи:
Необходимо записать массив данных (в сериализованном виде занимает 150 мб) в бинарный файл с такой структурой:

ID : Integer
Name : String[255]
IP : String[16]
Range1: array[] of int64
Range2: array[] of int64
Vloume : int
Timeout : int
Restout: int

В скрипте РНР уже есть подготовленный массив такого же структуры. Так вот, как это реализовать?

Усложняется все тем, что в массивах данные должны быть в инт64, чего РНР не поддерживает...
 

findnext

Новичок
сначала скажи зачем тебе это надо?

-~{}~ 26.08.09 14:09:

мне кажется что ты только усложняешь себе задачу.
 

zip111

Новичок
В двух словах - РНР скрипт подготавливает этот массив (берет данные из Б.Д., агрегирует ну и т.п.) для передачи в другую программу (скомпилированную и закрытую (по-моему на Делфи)). Та программа как раз будет работать с этим бинарным файлом.
 

findnext

Новичок
сохраняй как double. В delphi придётся написать функцию конвертирования Double2Int64
 

zip111

Новичок
думал над этим. Сохраняя в типе double - происходит утечка памяти и скрипт отваливается через некоторое время. Не знаю точно с чем это связано.

Кроме того, основной вопрос именно в записи структурированного бинарного файла средствами РНР

-~{}~ 26.08.09 14:17:

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

findnext

Новичок
http://php.net/manual/en/function.fopen.php

> $handle = fopen("/home/rasmus/file.gif", "wb");

-~{}~ 26.08.09 14:20:

кроме того, доступа к исходникам той программы нет. Соответственно функцию конвертации прикрутить не получиться
тогда можно написать парсер отдельно и парсить фаил перед вставкой в программу
 

zip111

Новичок
и? открываю файл в бинарном режиме?

пробовал я так. Пишу данные - все равно записываются обычные текстовые данные.

думал насчет pack\unpack - нет возможности работать с массивами...
 

whirlwind

TDD infected, paranoid
А в чем еще сложность, помимо 64 бит?

-~{}~ 26.08.09 14:24:

zip111 а в цикле pack религия не позволяет?
 

zip111

Новичок
тогда можно написать парсер отдельно и парсить фаил перед вставкой в программу
ну это конечно, как вариант. Но это усложнение, которого хочется избежать...

Я думал насчет того - что бы написать на С++ скрипт, которые будет получать сериализованный массив из РНР и писать в бинарник со структурой.. Но это капец.

-~{}~ 26.08.09 14:27:

выложи код который используешь
пока ничего не использую для записи. Все что пробовал, это не то что мне нужно.

-~{}~ 26.08.09 14:30:

whirlwind
1. Основная сложность в том, что я не понимаю как писать структурированный бинарный файл, в прицнипе. Мануал по pack\unpack очень абстрактный, статей не нашел.
2. Так если я циклом буду пакать - это ж уже не масив в структуре, а просто набор int-ов. Или я не прав?
 

whirlwind

TDD infected, paranoid
1. Структурированный бинарный файл пишется так же как и неструктурированный. В общем случае - побайтно.
2. Существует очень невысокая вероятность, что ты прав.
 

findnext

Новичок
zip111
тебе нужен перевод коретки на новую строку? это ты считаешь структуризированной записью? что в твоём понимании струтуризированный фаил?
 

cDLEON

Онанист РНРСlub
Скорее всего имелось ввиду паскалевое понятие "типизированный файл".
a:file of any_record;
Вообще - имхо проще было бы написать такую парсилку в делфе\си
 

ys

отодвинутый новичок
Может я что-то не понимаю, но мне кажеться, что файл - это набор байт и ему лесом кто и как будет потом их использовать.
Главное соблюсти byte order.
 

Adelf

Administrator
Команда форума
Если есть пример правильного файла для данной проги, то проанализировать его и с помощью pack решить.
типизированные файлы в Pascal/delphi - очень простые. основная сложность как раз в их нетекстовости :)

P.S. давно давно, когда писал паскале там так и было - бинарный файл и текстовый файл... никаких xml тебе :) ничего такого...
 

zip111

Новичок
В общем, пришел к решению, что проще передать управление в С++ программу через сериализованный массив. Но тут возникли тоже трудности, так как в С++ нет такого понятия serialize\unserialize в том виде, в каком это есть в РНР. Но это уже из другой оперы...
 

dimagolov

Новичок
zip111, странный ты человек. НИЧЕГО не мешает тебе писать бинарный файл на PHP, просто надо сформировать нужные бинарные строчки (большинство PHP ф-й имеют пометку binary safe). Нет, надо придумывать прослойку, которую надо написать, сделать еще однин протокол обмена. То есть трудно конвертить одно представление в другое, так будем конвертить в третье а потом из третьего во второе. Пипец логика.

п.с. но китайские комсомольцы ведь только стоя и в гамаке (с) ;)

-~{}~ 26.08.09 18:43:

п.п.с. формирование нужных бинарных данных на C++ и на PHP ничем принципиально отличаться не будет, и там и там надо ПОНИМАТЬ формат который пишем. если понимания нету, то на чем не пиши со всем будет проблема.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
очередное коллективное вынесение мозгов
один задает вопрос с очевидным решением, трое с пафосом доказывают, что проблему решить нельзя

почему никто не скажет, что одним вызовом ф-ции pack в цикле задача не решается?
спросили бы лучше, какой именно формат нужно получить в результате - какие там разделители полей и записей, что такое array[] of int64
разрядность INT тут до задницы

zip111
надо работать со строками. Не с Int-64, а со строками.
Из базы PHP получает строку, а не INT - ее ты можешь обработать без потерь. Надо считать - bcmath. Надо форматировать - пиши преобразование. Задача на усидчивость хоть на PHP, хоть на С.

-~{}~ 27.08.09 01:25:

>на С++ скрипт, которые будет получать сериализованный массив из РНР
в словарь загляни что-ли, значения слов узнай...
 

zip111

Новичок
Так в этом и проблема, я просто не понимаю, что являет собой "структурированный бинарный файл". И как его создать средствами РНР. Я ж об этом выше и написал.

-~{}~ 27.08.09 13:09:

Кто-нибуть может дать кусок кода, который будет может это сделать в том формате в котором мне нужно?
 

whirlwind

TDD infected, paranoid
Я же тебе объяснил - побайтно. Не знаешь сколько байт занимает integer? Или не ясно сколько байт занимает строка длиной 255 байт? Тебе нужно только реализовать функцию, которая приведет int64 строку в два 32х разрядных числа. Все остальное делается pack-ом. Если у тебя в структуре ID : Integer, Name : String[255] ну надо наверное думать, что сначала идет 4 байта ID, потом 255 байт Name и т.п. Не обладая телепатическими возможностями и не зная наверняка спецификации формата что тебе еще можно предложить?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху