PHP пакет и функция распаковки - PullRequest
0 голосов
/ 26 октября 2019

Когда я запускаю что-то вроде pack('N', "123455") или любой вариант опции 'N', я всегда получаю возвращаемый символ. Вышеприведенный пример возвращает �?.

Я пытаюсь работать с Clamd и передачей в сокет, и ему требуется "4-байтовое целое число без знака в сетевом порядке байтов". Я просто не могу заставить его работать.

1 Ответ

0 голосов
/ 26 октября 2019

Повторяющиеся двоичные данные почти всегда будут выводить что-то похожее на это. Двоичные данные не предназначены для чтения и понимания людьми.

$binary = pack('N', "123455");
$hex = bin2hex($binary);
echo $hex;
// 0001e23f

Ваш вызов pack() правильно возвращает двоичные данные 00 01 e2 3f, представляющие собой 4-байтовое представление с прямым порядком байтов числа 123455. Для числа вы можете проверить это, преобразовав число в шестнадцатеричное (echo dechex(123455); => 1e23f) и добавляя нули, пока не достигнете 4 байтов (8 шестнадцатеричных символов, 0001e23f).

Echo 'При вводе двоичных данных PHP будет обрабатывать их как строку с символами 00 01 и e2 3f. 0x0001 является управляющим символом (отображается как «�»), а 0xe23f не существует как предопределенный символ (он попадает в область частного использования стандарта Unicode), поэтому он будет отображаться как «?».

...