Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение двоичного файла 
:(
    Опции темы
Agent_00
Дата 7.8.2011, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Доброе время суток, столкнулся с такой проблемой, есть двоичный файл, который записан с помощью с++ по структуре:
Код

struct BASE_REC              
{
 union {
  float a1;               
  long a2;                  
  struct {
   unsigned short a3;
   unsigned short a4; 
  } bb1;
  long a5;        
 };
 union {
  float c1;                    
  long c2;              
  long c3;
  long c4;      
 };
 union {
  float d1;                   
  long d2;                
  struct {
   unsigned short d3;   
   unsigned short d4;  
  } bb2;
  struct {
   unsigned char e1;
   unsigned char e2;
   unsigned char e3;
   unsigned char e4;
  } bb3;
 };
 unsigned char f1;
 unsigned char f2;
};

counts = 1243;

BASE_REC *buff = new BASE_REC[counts];

fwrite(buff,sizeof(BASE_REC),counts,inpf)


хочу прочитать этот файл с помощью php, делаю так:

Код


$contents = fread($inpf, 50); // 50 байт на структуру
        
$arr = unpack("fa1/la2/Sa3/Sa4/la5/fc1/lc2/lc3/lc4/fd1/ld2/Sd3/Sd4/Ce1/Ce2/Ce3/Ce4/Cf1/Cf2",$contents);


получаю совершенно не то что нужно, почитав про функцию UNION понимаю, что память выделяется только под самую большую переменную в union, и значение учитывается только одно, тогда попробовал сделать так:

Код

$contents = fread($inpf, 14); // 14 байт на структуру
        
$arr = unpack("fa1/fa2/fa3/Cf1/Cf2",$contents);


опять получаю не то что нужно. Подскажите как правильно прочитать такой файл в php и получить структуру со значениями
PM MAIL   Вверх
Pfailed
Дата 7.8.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39



Может проще будет сделать расширение php на C++ и с помощью него прочитать и передать данные в php?


--------------------
PM MAIL   Вверх
ksnk
Дата 7.8.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

$contents = fread($inpf, 14); // 14 байт на структуру
$result=array();
$u1=substr($contents,0,4); // первый юнит
$result['a1']=unpack("f",$u1)[0];
$result['a2']=unpack("l",$u1)[0];
$result['a3_4']=unpack("CC",$u1);
$result['a5']=unpack("l",$u1);

$u2=substr($contents,4,4); // второй юнит
...
        



что-то вроде такого.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Agent_00
Дата 7.8.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Pfailed может быть и проще, но все модули написаны на php. 

ksnk если честно немного не понятно как это так:
Код

$result['a1']=unpack("f",$u1)[0]
 

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

Код

$result['a3_4']=unpack("CC",$u1);


тут скорее всего  вместо СС -> S/S

Как я понял идея такая, что мы 4 байта, выделенных на юнит, распаковываем для каждой переменной из структуры?
PM MAIL   Вверх
ksnk
Дата 7.8.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Agent_00 @  7.8.2011,  14:01 Найти цитируемый пост)
Как я понял идея такая, что мы 4 байта, выделенных на юнит, распаковываем для каждой переменной из структуры? 

Ну да.

В результате unpack получается массив и выборка должна была-бы вернуть первый элемент... Более работоспособным может быть такой вариант
Код

$contents = fread($inpf, 14); // 14 байт на структуру
$result=array();
$u1=substr($contents,0,4); // первый юнит
$result['a1']=unpack("f",$u1);$result['a1']=$result['a1'][0];
$result['a2']=unpack("l",$u1);$result['a2']=$result['a2'][0];
$result['a3_4']=unpack("C*",$u1);
$result['a5']=unpack("l",$u1);$result['a5']=$result['a5'][0];

...
print_r($result);

Хотя, вероятно, более читабельным будет сочинить функцию, выковыривающую нужное значение по нужному смещению...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Absinthe
Дата 7.8.2011, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

Может проще будет сделать расширение php на C++ и с помощью него прочитать и передать данные в php?
 Не проще. Как может быть проще чтение кучи манов и написание экстеншена, чем использовангие единственной функции?
PM MAIL   Вверх
Agent_00
Дата 7.8.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



ksnk если брать как 0 элемент от массива result, то в нем ничего нет, но есть в 1 элементе массива, но если брать его, то получится что одно и тоже значение будет представлено в разных типах, а если типы одни (как во втором юните) - будут одинаковые значения и не понятно к чему они относятся. Может кто знает другой вариант?


Absinthe

Цитата

Цитата

Может проще будет сделать расширение php на C++ и с помощью него прочитать и передать данные в php?
 Не проще. Как может быть проще чтение кучи манов и написание экстеншена, чем использовангие единственной функции? 


не вижу смысла писать дополнительное ПО ради импорта данных и передачу его в php, когда весь код проекта написан на php. Искал может возможен импорт си'шных функций в php, но сколько не искал, пишут что нельзя, поэтому и возникает вопрос, как эту структуру изъять из файла с помощью языка php.

Это сообщение отредактировал(а) Agent_00 - 7.8.2011, 17:45
PM MAIL   Вверх
Pfailed
Дата 7.8.2011, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39



Насколько понимаю то, что окажется в файле после fwrite сильно зависит от компилятора и архитектуры. Например long на 32 битной архитектуре 32 бита, а на 64 битной 64. Поэтому не советую этим заниматься. Пусть ваша C++ программа одназначно сериализует данные прежде чем писать их в файл.


--------------------
PM MAIL   Вверх
Agent_00
Дата 7.8.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Pfailed она однозначно пишет под 32 бита, программа кем то писанная под дос еще. Все что мне от нее нужно это прочитать генерируемый ею файл, по этой структуре.
PM MAIL   Вверх
Agent_00
Дата 8.8.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 15.2.2007

Репутация: нет
Всего: нет



Проблему решил, спасибо всем кто помог, тему можно закрывать.

Решение:

Код

$contents = fread($inpf, 14); // 14 байт на структуру

$result = unpack("fa1-a5/fc1-c4/fd-e/Cf1/Cf2", $contents);

print_r($result);

// В итоге получим ассоциативный массив

Array( [a1-a2] => 213.235235 [c1-c4] => 0.321; [d-e] => 54.32211 [f1] = 32 [f2] = 0 )



В зависимости, по какому принципу был записан файл на с++, по такому же принципу нужно распаковывать его в php.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.