Я работаю с проектом, который использует собственный протокол TCP. У меня есть все, кроме одной вещи: протокол требует 4 байта перед сообщением, которые определяют длину пакета. В NodeJS это делается через:
var b = new Buffer(4);
b.writeUInt32BE(data.length, 0);
Но есть ли такой способ и в PHP? Я думал об использовании pack()
— но у меня нет опыта работы с этой функцией. Мне также нужно прочитать пакет того же формата, поэтому я также должен иметь возможность получить целое число из первых 4 укусов тоже.
Использование пакета — это правильный путь в PHP, и вот пример того, как использовать его для возврата необходимой информации:
<?php
$string = 'hello world';
$bytes = pack ( 'N', strlen ( $string ) ); // unsigned 32 bit big endian byte order
?>
Чтобы проанализировать первые 4 необработанных байта обратно в число, предполагается, что переменная с именем $ rawBytes содержит данные, считанные из пакета tcp.
<?php
$decoded = unpack ( 'N', substr ( $rawBytes, 0, 4 ); );
$length = end ( $decoded );
?>
Одна неприятная ошибка в PHP заключается в том, что двоичный файл понимает только 32-битные целые числа со знаком на машинах Windows и на 32-битных компьютерах Linux / Macintosh / Unix.
От -2 147 483 648 до 2 147 483 647
64-битные двоичные файлы PHP, работающие на компьютерах Linux / Macintosh / Unix, имеют максимальное целочисленное значение 64-битного целого числа со знаком.
−9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
Но использование 64-разрядного двоичного файла на компьютере с Windows по-прежнему имеет целочисленный размер 32-разрядного целого числа со знаком.
Все, что находится за пределами целочисленных границ, будет приведено к числу с плавающей запятой.
Других решений пока нет …