@antobra

PHP pack N выдает разные данные на разных устройствах, как так?

Добрый день. Помогите разрешить вопрос.

Ситуация:

в файл помещаются данные в виде чисел после функции pack ( "N", $num ). Файл загружается на сервер и unpack ( "N", $num )[1] выдает уже другие числа.
То есть, при разбиении по 4 байта на моем компьютере и сервере выдаются разные числа. Здесь очевидно можно проследить связи между устройствами, но с таким сталкиваюсь впервые. Как такое может быть и чем решить? У меня стоят разные версии php (7.3 и 7.0), но ф-я pack вроде не менялась.

Поясню еще раз, что скрипт, который читает данные из созданного файла на моем компьютере и сервере тот же самый. Но данные выдаются разные. По миллиону раз все перепроверил - не перепутал ли пути к файлу, тот ли скрипт загружается и подобное. Пришел к выводу - дело именно в Pack на разных устройствах. Самое интересное, что некоторые значения unpack выдает верно. Не понимаю, что происходит ¯\_(ツ)_/¯

На всякий случай оставлю данные устройств. У меня стоит MacOs Catalina:

PHP 7.3.3 (cli) (built: Mar 8 2019 16:40:07) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.3, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.3, Copyright (c) 1999-2018, by Zend Technologies


Сервер:


Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
Stepping: 2
CPU MHz: 2399.996
BogoMIPS: 4799.99
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
L3 cache: 16384K
NUMA node0 CPU(s): 0,1

PHP 7.0.30-0+deb9u1 (cli) (built: Jun 14 2018 13:50:25) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.30-0+deb9u1, Copyright (c) 1999-2017, by Zend Technologies


Как решить, что можно сделать?

Благодарю за любую помощь/мысли/предложения
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
Предостережение
Необходимо отметить, что PHP сохраняет значения типа integer какзнаковые с машинно-зависимым размером (C тип long). Все числа, переданные как integer, но выходящие за границы этого типа будут сохранены с типом float. При упаковке этих float как integer, они будут переданы с типом integer. Это может как совпадать, так и нет с заданным шаблоном.

Наиболее частым является случай, когда упаковываются беззнаковые числа типа integer. В системах, где integer имеет размер в 32 бита, число обычно передается по тому же шаблону, как если бы integer был беззнаковым (хотя, это зависит от определенных преобразований из знаковое в беззнаковое, согласно стандарту С). В системах, где тип integer имеет размер в 64 бита, тип float не имеет мантиссы, достаточной по размеру для хранения значения без потери точности. Если эти системы также имеют простой 64-битный С тип int (большинство UNIX систем не имеют), то единственным путем для использования формата I в верхнем разряде является создание отрицательных integer значений с тем же представлением как и в определенном беззнаковом значении.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы