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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами, бинарными 
V
    Опции темы
Lеstat
Дата 31.1.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

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



вот проблема возникла... сперва на java, а теперь и на пхп
никак не могу получить число (интеджер) из прочитанных 4 байт из файла =(
не подскажите как это можно провернуть?
PM MAIL ICQ   Вверх
wsr
Дата 31.1.2006, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fuzzy Logic
*


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

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



Типа прочитанные данные (4байта) являются числом??? И оно точно INT???
Если да, что просто к этому числу прибавь единицу, и отними единицу, и получишь чисто INT.
--------------------
 ICQ : 918-318Сайт : Lock-Team 
PM MAIL WWW ICQ   Вверх
Lеstat
Дата 31.1.2006, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

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



чето я врубиться не могу =( к какому числу единицу прибавить нужно?

вот конкретный пример
Код

$file="1.bin";
$f=fopen($file,"rb");
$size = fgets($f,4);

$size массив из 4 байтов вроде
мне нужно число из них получить... т.е из этого массива
PM MAIL ICQ   Вверх
Illuminaty
Дата 31.1.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


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

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



Вообще-то, fgets считывает строку из файла. Таким образом, у тебя в $size лежит строка, длинною в 4 символа. Далее все зависит от того, как у тебя число в файле записано...
Фрагмент файла или
Код

var_dump($size)
покажи, а то не понятно, что там у тебя...
PM MAIL ICQ   Вверх
wsr
Дата 31.1.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fuzzy Logic
*


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

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



Привиди пример числа полученного при чтении четырех байт.
А так по твоему примеру : $size = $size + 1; $size = $size - 1;
И если значение $size действительно принадлежит диапазону целых чисел, то вот is_int ( $size ) должен вернуть TRUE, иначе значение переменной не интеджер.
--------------------
 ICQ : 918-318Сайт : Lock-Team 
PM MAIL WWW ICQ   Вверх
Janus
Дата 31.1.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Мне не известен способ решить твою проблему. Дело в том, что РНР в твоем случае считывает именно строку, состоящую из 4 символов.

При попытке привести типы, система попытается в строке отыскать символы 0 - 9 (именно символы) и сделать число из них. РНР слишком высокоуровневый язык. Конечно, можно попробовать что-нибудь замутить с побитовыми операциями - ето может быть единственным способом.
--------------------
Проект "Репликатор" 
PM MAIL   Вверх
Mal Hack
Дата 31.1.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Для бинарноо чтения надо юзать fread.
Цитата(Lеstat @ 31.1.2006, 01:47 Найти цитируемый пост)

никак не могу получить число (интеджер) из прочитанных 4 байт из файла =(

А что ты туда писал? начнем с этого и что ты получаешь?
PM ICQ   Вверх
Janus
Дата 31.1.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я предполагаю, что он записывал число, используя С++, Pascal или что-то такое. Например, так:
Код

program p1;
var
  x: integer;
  f: file of integer;
begin
  x := 10;

  assign(f, 'file.bin');
  rewrite(f);
  write(f, x);
  close(f);
end.

В этом случае, мы получим в файле 4 символа - 4 байта, которые в совокупности представляют собой бинарное представление целого числа 10 со знаком. Там должно быть что-то вроде (не знаю только, в прямом или инверсном порядке, это от компилятора зависит):

#$0a#$00#$00#$00

Таким образом, чтобы получить число, нужно считать 4 символа:

"\x0a", "\x00", "\x00", "\x00"

Потом получить их десятичные коды:

10, 0, 0, 0

Потом каждое число перевести в шестнадцатеричный формат:

a, 0, 0, 0

Потом все шестнадцатеричные строковые представления чисел свести в одну строку:

000a

и преобразовать в десятичный вид:

10

Примерно так.
--------------------
Проект "Репликатор" 
PM MAIL   Вверх
Lеstat
Дата 31.1.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

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



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

открываю файлик программой и смотрю показывает 199000


сперва я отрыл код

Код

function makehex($st)
{
for($i=0; $i<strlen($st); $i++) $hex[]= sprintf ("%2X",ord($st[$i]));
return join (" ",$hex);
}
echo hexdec(makehex($size))."<br>";


он выдает не 199000, а 362800 такое вот

если написать echo makehex($size)."<br>"; выдает "58 9 3 0"
после
Код

$size=$size+1;
$size=$size-1;
echo $size."<br>"; 

выдает 0

мой код на яве в пхп тоже что-то не работает
Код

size = (file[3] & 0xff) << 24 | (file[2] & 0xff) << 16 |  (file[1] & 0xff) << 8 |  (file[0] & 0xff);


Это сообщение отредактировал(а) Lеstat - 31.1.2006, 18:05
PM MAIL ICQ   Вверх
Mal Hack
Дата 31.1.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(Lеstat @ 31.1.2006, 17:53 Найти цитируемый пост)

файлик создается не мной... он уже есть

Ты знаешь структуру файла?
Если нет, то вообще ничего не сделаешь, если знаешь, то показывай.
PM ICQ   Вверх
Lеstat
Дата 31.1.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

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



первые 12 байт пропускаю, т.к. там не нужные мне данные
в следующих 4 байтах нужное мне число
на яве все нормально читается, а вот пхп не хочет...
Код

$f=fopen($file,"rb");
fread($f,4*3);
$size = fread($f,4);

вобщем в $size должны быть нужные 4 байта
PM MAIL ICQ   Вверх
Mal Hack
Дата 31.1.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Откуда ты так уверен, что тебе нужны именно эти 4 байта?
Как файл пишется?
PM ICQ   Вверх
Lеstat
Дата 31.1.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

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



а какие еще данные читать
если первые 3 числа, записанные по 4 байта каждое мне не нужны, е четвертое, записанное тоже в 4 байта, нужно
PM MAIL ICQ   Вверх
Mal Hack
Дата 31.1.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Lеstat как пишется сам файл исходно. Ты структуру скорее всего не правильную используешь.
PM ICQ   Вверх
Ciber SLasH
Дата 31.1.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А функции settype, intval, что не работают ?
PM   Вверх
Lеstat
Дата 31.1.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

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



Mal Hack, не структуру я прально использую...
я уже писал программу только на java
все работало, так что теперь нужно переписать кусок на пхп который просто выдаст число из файла

в яве я получаю число из этих 4 байт вот таким кодом
Код

//пропускаю 3*4 байта
//читаю 4 следующих байта в file
size = (file[3] & 0xff) << 24 | (file[2] & 0xff) << 16 |  (file[1] & 0xff) << 8 |  (file[0] & 0xff);
//size получается правильное целое число

а вот в пхп не могу что-то

Ciber SLasH, да работают, но я не знаю как их заюзать для моего случая... ща попробую, но мне кажется не прокатит
PM MAIL ICQ   Вверх
Lеstat
Дата 1.2.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

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



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

число 199000 в hex выглядит как 30958
вот эта функция
Код

function makehex($st)
{
for($i=3; $i>=0; $i--) $hex[]= sprintf ("%2X", ord($st[$i]));
return join (" ",$hex);
}

обрабатывая мои четыре байта выдает 0 3 9 58
я сперва подумал, что тут перепутаны два байта в числах 3 0 9 58 и 0 3 9 58
но функция вписывает второй байт как 9, а не 09... таким образом числа в которых байты записаны одним символом отображаются неправильно т.к. 30958, например, должно составляться из значений 00 03 09 58, а в моем случае составлялось из 0 3 9 58 что приводит к отсутствию ноля перед девяткой
для того чтобы все было нормально нужно исправить sprintf ("%2X", ord($st[$i])) на sprintf ("%02X", ord($st[$i])), тогда нули будут добавляться!



вобщем написал функцию, которой скармливаем массив байтов (строку из файла), а она выдает число
как читать из файла вроде не важно... у меня и с fgets(), и с fread() работает одинакого
Код

function readdec($bytes)
{
for($i=strlen($bytes)-1; $i>=0; $i--) $hex[]= sprintf ("%02X", ord($bytes[$i]));
return hexdec(join(" ",$hex));
}


всем спасибо... буду очень рад если эта тема кому-нить поможет в аналогичной ситуации
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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