Двоичные данные PHP — не зависит от машины

У меня есть небольшие проблемы с представлением двоичных данных в PHP.
Я развиваю связь между веб-сервером (php) и foxtrot plc machine. Я общаюсь на уровне укуса, но я не могу найти правильные функции в php, которые соответствуют всем моим потребностям …

Я ищу простой способ обработки и преобразования двоичных данных в и из usint, sint, uint, int, udint, dint, real, string и т. Д. Но он мне нужен независимо от компьютера веб-сервера — потому что важной частью является plc.

Лучше всего выглядит функция упаковки / распаковки, но в ней отсутствуют некоторые форматы — например, длинная подпись — порядок байтов в порядке байтов. И мне нужен каждый отдельный байт.

ПЛК 16 бит, поэтому размеры:
sint — 8 бит / int — 16 бит / dint — 32 бит

// I need something like this
$lib->convertToBytes(65000); // result [0 => 11101000, 1 => 11111101]
$lib->convertToInt([0 => 11101000, 1 => 11111101]); // result 65000

// And this
$lib->convertToBytes(-65000); // result array
$lib->convertToBytes(658.2); // result array
$lib->convertToBytes(-320.8); // result array

Мой веб-сервер 64-битный, поэтому, если я позвоню:

decbin(-65000) // i get "1111111111111111111111111111111111111111111111110000001000011000" (64)
pack('l', -65000) // i get "\x18\x02\xff\xff" (4) - this seems good but i need machine independent representation - little endian byte order in every situation

Кто-нибудь знает функцию / функции / библиотеку, которую я могу использовать?

Thanx

3

Решение

Вы ищете упаковка () функция. Он не имеет подписанных / неподписанных вариантов всех типов, потому что они не нужны, как отмечается в документации:

«Обратите внимание, что различие только между знаковыми и беззнаковыми значениями
влияет на функцию unpack (), где как функция pack () выдает то же самое
результат для подписанных и неподписанных кодов формата. «

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

Младший байт: $val & 0xff;

Второй байт: ($val >> 8) & 0xff;

Третий байт: ($val >> 16) & 0xff;

Чтобы преобразовать отдельные байты в целое число, выполните обратное:

$val = $byte[0] | ($byte[1] << 8) | ($byte[2] << 16) ...

И так далее.

1

Другие решения

Других решений пока нет …