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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> числа из бинарного файла 
V
    Опции темы
imm
Дата 12.3.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день, 


У меня есть файл в котором много всякой инфы и создается он не с помощью php, но это не важно.


Если вы поможите мне решить задачу ниже, то все остальное тоже вполне решается.

Дано: файл в котором в бинарном виде находится два числа одна в начале файла на 4 байта, а другое сразу после него на 2 байта.

Нужно: получить эти два числа.



За ранее благодарен.
PM MAIL WWW ICQ   Вверх
bars80080
Дата 12.3.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



чем отличается от обычного чтения?
Код

$fp = fopen('file.txt', 'r');
if($fp) {
$str = fgets($fp, 999); // хотя можно и 6
$dig1 = substr($str, 0, 4);
$dig2 = substr($str, 4, 2);
}

остаётся только проверок накидать, ну и может использовать fread вместо fgets, но это уже по задаче
PM MAIL WWW   Вверх
imm
Дата 12.3.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Эх думал обойдусь без примера...

Например для однобайтового числа 238 в файле будет текстовая "й", т.е. символ с кодом 238, а если число на 4 байта...
PM MAIL WWW ICQ   Вверх
bars80080
Дата 12.3.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата
а если число на 4 байта... 

значит там будет четыре байта символов ? (йцуе) ?

тогда substr($str, 0, 4);

Добавлено через 1 минуту и 35 секунд
получили символы, затем режем их с помощью удобной нам функции и преобразуем в коды по методике (если это ascii, то ord($dig1[0]))
PM MAIL WWW   Вверх
mishaSL
Дата 12.3.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

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



imm, пример этих 6 байт покажите.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
flashaa
Дата 12.3.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код символа(его числовое значение) вычисляется ф-цией ord().
Cоотвественно считать первые 4 байта и получить их как число будет выглядеть так:
Код

$first = substr($content, 0, 4); // Получаем первые 4 байта
$var = '';
for($i = 0; $i < strlen($first); $i++) {
    $var .= decbin(ord($first[$i]));
}

$var = bindec($var); // Получаем десятичное представление числа

Тут последовательно вычисляется код каждого символа и затем преобразуется в двоичную форму (01002..).
Если поставить рядом все такие нолики и единички от каждого символа, то получится искомое четырехбайтовое число. В десятичном представлении. Затем преобразуем число в десятичную форму.
Я мог напутать со старшинством байтов, т.е старшие байты может быть надо добавлять слева, а не справа, при сборе числа в двоичной форме. Если не будет работать, попробуйте сделать так

Код

$var = decbin(ord($first[$i])) . $var;


Это сообщение отредактировал(а) flashaa - 12.3.2008, 17:03
PM MAIL   Вверх
ksnk
Дата 12.3.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Угу, а про pack/unpack кто-нибудь слышал? 
Код

     $_r = fread($f,6);
     $a=unpack('LS',$_r);
     print_r($a);




Это сообщение отредактировал(а) ksnk - 12.3.2008, 17:29


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


Шустрый
*


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

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



Спасибо 
ksnk, именно то что нужно.
PM MAIL WWW ICQ   Вверх
flashaa
Дата 13.3.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, с pack значительно короче.
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.