У меня есть шестнадцатеричная строка, которая читает 18000000
эта строка находится в порядке байтов хоста (Little Endian), и мне нужно преобразовать ее в порядок байтов сети (Big Endian). Результирующая шестнадцатеричная строка будет 00000018
,
Подводя итог мне нужно конвертировать
18000000 to 00000018
Как мне добиться этого в PHP?
Ты можешь использовать pack
/ unpack
Функции для преобразования порядка байтов:
/**
* Convert $endian hex string to specified $format
*
* @param string $endian Endian HEX string
* @param string $format Endian format: 'N' - big endian, 'V' - little endian
*
* @return string
*/
function formatEndian($endian, $format = 'N') {
$endian = intval($endian, 16); // convert string to hex
$endian = pack('L', $endian); // pack hex to binary sting (unsinged long, machine byte order)
$endian = unpack($format, $endian); // convert binary sting to specified endian format
return sprintf("%'.08x", $endian[1]); // return endian as a hex string (with padding zero)
}
$endian = '18000000';
$big = formatEndian($endian, 'N'); // string "00000018"$little = formatEndian($endian, 'V'); // string "18000000"
Чтобы узнать больше о pack
формат взглянуть на http://www.php.net/manual/en/function.pack.php
по-другому
$input = 18000000;
$length=strlen((string)$input);
$sum=0;
$numbers="";
while ($length>0) {
$number = $input % 10;
$numbers.= $number;
$input = $input/10;
$length--;
}
echo $numbers;
Я просто наткнулся на этот ответ, когда искал что-то, но я закончил тем, что сделал что-то намного проще (так как я знал, что моя строка всегда будет иметь начальный ноль, если необходимо выровнять по границе двух символов):
$littlendian = join(array_reverse(str_split($bigendian), 2)));
Очевидно, что если ваш бигендовский ввод не очень хорошо отформатирован, этот прием не сработает напрямую 🙂
Попробуй это:
$result=bin2hex( implode( array_reverse( str_split( hex2bin($src) ) ) ) );