node.js — байтовый буфер в PHP?

Я работаю с проектом, который использует собственный протокол TCP. У меня есть все, кроме одной вещи: протокол требует 4 байта перед сообщением, которые определяют длину пакета. В NodeJS это делается через:

var b = new Buffer(4);
b.writeUInt32BE(data.length, 0);

Но есть ли такой способ и в PHP? Я думал об использовании pack() — но у меня нет опыта работы с этой функцией. Мне также нужно прочитать пакет того же формата, поэтому я также должен иметь возможность получить целое число из первых 4 укусов тоже.

1

Решение

Использование пакета — это правильный путь в 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-разрядного целого числа со знаком.

Все, что находится за пределами целочисленных границ, будет приведено к числу с плавающей запятой.

2

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

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