За последние 24 часа нас посетили 15784 программиста и 1540 роботов. Сейчас ищут 756 программистов ...

как конвертировать 8 байт в double на php

Тема в разделе "PHP для новичков", создана пользователем orfelin, 28 янв 2014.

  1. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    подскажите плиз как на пыхе реализовать сабж ?
    имеет массив состоящий из 8 чисел размерностью unsigned chart по стандарту IEEE754
    необходимо интерпретировать их как double число

    тоесть как то склеить на пхп 8 байт чтобы на выходе был double
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Телекинезом не пользуемся.
     
  3. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    вау...
    ну ладно раз так плохо написана суть проблемы. разжую досконально .

    в машинном представлении число double занимает 8 байт памяти ( по крайней мере в той реализации которую мы используем на сервере )
    в БД массив данных хранится как bytea формат
    стоит задача вывести корректно лог.

    проблем с числами типа integer нет. обратное преобразование очень простое $valint = $stream[ 0 ] | ( $stream[ 1 ] << 8 ) | ( $stream[ 2 ] << 16 ) | ( $stream[ 3 ] << 24 ) - получаем на выходе int32 число по его "машинному" представлению в памяти
    машинному в кавычках хотя по сути в массиве $stream - дамп куска памяти сервера где лежат данные ( структуры: числа char, int, float и double ) просто в пхп мы не можем к сожалению напрямую обращатьсяк памяти и через memcpy формировать числа.

    вопрос стоит в том как из массива байт, например, { 0x00, 0x02, 0x23, 0xFF, 0xFD, 0x00, 0xCC, 0x01 } получить в php double число
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чем ситуация отличается от int?
     
  5. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    вы сейчас посмеялись?
    int не double :-(

    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } - если к примеру этот массив "склеивать" аналогично инту то как integer будет число 1
    но это машинное представление числа double 7.2911220195563975e-304

    машинное представление чиста 1.0 это { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f }
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $string='0x00, 0x02, 0x23, 0xFF, 0xFD, 0x00, 0xCC, 0x01';
    2. $string=explode(',',$string);
    3. $string=join('',$string);
    4. $string=(double)join('',unpack('H*',$string));
    5. echo $string; // 3.0783030203078E+77 
    Или я чего-то не то?
     
  7. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    а нет такой строки. в $stream именно массив из чисел 0 2 23 ff fd 00 cc 01
    0x23 - это не строка. это число 23H в 16 ричной системе счисления
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
  9. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    я знаю как преобразовывать из одной СС в другую
    я не знаю как массив из 8 байт преобразовать в пхп в double число
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    разложить с помощью цикла foreach(), for() или с помощью функции join();
     
  11. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    спасибо попробую.
    жаль что циклы в пхп оч медленные ((((
     
  12. immortal.1986

    immortal.1986 Активный пользователь

    С нами с:
    24 сен 2013
    Сообщения:
    257
    Симпатии:
    0
    for по скорости почти такой же как и на С
     
  13. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    насмешили.
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ну, а что не понятного, динамический типизированный язык всегда будет медленнее статически типизированного...
    К тому же в php отсутствует JIT компилятор.
    Да и вообще тут типы проверяются на этапе выполнения, вместо того, чтобы компилировать...
    Зато в С, нужно больше времени, чтобы собирать проект ;)

    Но вот таки, ускорить думаю акселераторами можно...
     
  15. orfelin

    orfelin Активный пользователь

    С нами с:
    3 мар 2011
    Сообщения:
    36
    Симпатии:
    0
    да все ясно - каждому языку свою нишу применения.
    никто же не пишет на пыхе прикладной или системный софт )

    смотря что вы под сборкой php понимаете :)
    у меня за 2-3 секунды компилируется и линкуется С++ проект из примерно 500 cpp и h файлов ( много оперативы + SSD диск + core I7 творят чудеса )

    Добавлено спустя 48 секунд:
    можно свой модуль написать для апача или пыха. :)
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    массив с байтами или строками в hex формате?
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Есть такие кто пишет и уже обсуждалось...
    Интерпретатор и этим все сказано.
    От-того, что там файлы, мало, чего значит, скорее тут будет зависеть от концепции скриптов и от их тяжести...
    Так как фактически файл ничего не весит по умолчанию.
    И на сколько будет завернут проект и его структура, компилятор может немного и подумать.
    Компиляция всего+выполнение...
     
  18. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    забиваем в яндексе или гугле иеее754, переходим по ссылкам, в итоге находим алгоритм (или даже реализацию на яваскрипте или с), переделываем на пхп ... профит.

    вот например http://www.softelectro.ru/ieee754.html

    или вот что-то похожее из моей программы
    Код (Text):
    1.     private function convert_f($s_value)
    2.     {
    3.         $a_value = unpack('N', $s_value);
    4.         $n_value = $a_value[1];
    5.         $n_sign = ($n_value >> 31) ? -1 : 1;
    6.         $n_exp  = ($n_value >> 23) & 0xff;
    7.         $n_mant = ($n_exp == 0) ? ($n_value & 0x7fffff) << 1 : ($n_value & 0x7fffff) | 0x800000;
    8.         $n_exp -= 150;
    9.         $f_value = $n_sign * $n_mant * pow(2, $n_exp);
    10.  
    11.         return $f_value;
    12.     }