Преобразовать Int в 4-байтовую строку в переполнении стека

Мне нужно преобразовать целое число без знака в 4-байтовую строку для отправки в сокет.

У меня есть следующий код, и он работает, но кажется … отвратительным.

/**
* @param $int
* @return string
*/
function intToFourByteString( $int ) {
$four  = floor($int / pow(2, 24));
$int   = $int - ($four * pow(2, 24));
$three = floor($int / pow(2, 16));
$int   = $int - ($three * pow(2, 16));
$two   = floor($int / pow(2, 8));
$int   = $int - ($two * pow(2, 8));
$one   = $int;

return chr($four) . chr($three) . chr($two) . chr($one);
}

Мой друг, который использует C, говорит, что я должен быть в состоянии сделать это с помощью битовых сдвигов, но я не знаю как, и он недостаточно знаком с PHP, чтобы быть полезным. Любая помощь будет оценена.

Чтобы сделать обратное у меня уже есть следующий код

/**
* @param $string
* @return int
*/
function fourByteStringToInt( $string ) {
if( strlen($string) != 4 ) {
throw new \InvalidArgumentException('String to parse must be 4 bytes exactly');
}

return (ord($string[0]) << 24) + (ord($string[1]) << 16) + (ord($string[2]) << 8) + ord($string[3]);
}

0

Решение

Это на самом деле так же просто, как

$str = pack('N', $int);

увидеть pack. И наоборот:

$int = unpack('N', $str)[1];

Если вам интересно, как сделать упаковку, используя сдвиги битов, это выглядит так:

function intToFourByteString( $int ) {
return
chr($int >> 24 & 0xFF).
chr($int >> 16 & 0xFF).
chr($int >>  8 & 0xFF).
chr($int >>  0 & 0xFF);
}

По сути, каждый раз сдвигайте восемь битов и маскируйте 0xFF (= 255), чтобы удалить старшие биты.

2

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

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