问题
I have a Hex String which reads 18000000
this String is in Host byte order (Little endian) and I need to convert it to Network byte order (Big endian). The resultant Hex String will be 00000018
.
To summarize I need to convert
18000000 to 00000018
How do I achieve this in PHP?
回答1:
You can use pack
/ unpack
functions to convert endianness:
/**
* 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"
To learn more about pack
format take a look at http://www.php.net/manual/en/function.pack.php
回答2:
another way
$input = 18000000;
$length=strlen((string)$input);
$sum=0;
$numbers="";
while ($length>0) {
$number = $input % 10;
$numbers.= $number;
$input = $input/10;
$length--;
}
echo $numbers;
回答3:
I just stumbled on this answer while searching for something, but I ended up doing something a lot simpler (since I knew my string was always going to have a leading zero if necessary to align to a two character boundary):
$littlendian = join(array_reverse(str_split($bigendian), 2)));
Obviously if your bigendian input isn't well formatted like that, this trick isn't going to work directly :)
回答4:
Try this:
$result=bin2hex( implode( array_reverse( str_split( hex2bin($src) ) ) ) );
来源:https://stackoverflow.com/questions/40828024/convert-string-in-host-byte-order-little-endian-to-network-byte-order-big-end