Использование числа типа word

alad

Новичок
Использование числа типа word

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

Есть проблемка, которую не получилось решить самому, даже мануал не помог... теперь вот решил попросить совета у общественности. ;)

Итак у нас есть некий файл. В нем, в виде слов лежат знаковые целые числа от
-32768 до 32767.

так вот, мне нужно получить эти числа.

я открываю файл в бинарном режиме
$fits=fopen("H171_20010815.134535.fits","rb")

читаю слово
$str=fread($fits,2);

.... а вот дальше-то как быть? Как мне эти два символа преобразовать в знаковое целое число?

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

самое близкое:

$data=-1;

а потом $data=0+$str;

и number_format($data)
 

whirlwind

TDD infected, paranoid
2 байта - сначала младший, затем старший. Назовем $lobits, $hibits

$number = $lobits + $hibits * 256;

НО надо еще помнить о правилах хранения числел (тупоконечные/остроконечные). Приведенный вариант для интеловских платформ.
 

alad

Новичок
ты имеешь в виду перебросить байты?

$data=$str{1}+$str{0}*256 ...?

а он сообразит, что это знаковое? или ПХП по умолчанию примет число знаковым?
 

whirlwind

TDD infected, paranoid
>а он сообразит, что это знаковое?

Не думаю. Тогда так попробуй

$number = $lobits + $hibits * 256 - 0x7FFF;


PS. не, все-таки подглючиваю
 

alad

Новичок
что-то я не уверен.... :(

ведь как только мы захотим работать с байтом, как с числом, ПХП дорастит его до 4 байт и наплюёт, что старший бит у нас знаковый.... или нет?
 

alad

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

неужели в ПХП нет средств сделать это попроще? а то легче на асме для PIC'ов обработать!!!!! :)
 

alad

Новичок
ну вот.... оно, кажется. А я о ней не знал. Спасибо.

получается конструкция
$word=pack(s,$str);
$array=unpack("number",$word);

$array[number] и будет нашим числом. Так? ничего не путаю?

-~{}~ 09.12.05 15:46:

Или так?

$array=unpack("snumber",$str);

$array[number]=
 

ksnk

прохожий
Для решения задачи более эффективно будет, наверное
PHP:
$str=file_get_contents("H171_20010815.134535.fits");
$array=unpack("n*",$str);
И array и будет массивом тех самых слов....
Если, конечно, файл исходный не очень большой...
 
Сверху