将主机字节顺序(Little endian)中的字符串转换为网络字节顺序(Big endian)

时间:2016-11-27 10:44:49

标签: php string hex endianness

我有一个Hex字符串,它读取18000000这个字符串是主机字节顺序(Little endian),我需要将它转换为网络字节顺序(Big endian)。生成的十六进制字符串将为00000018

总结一下,我需要转换 18000000 to 00000018

我如何在PHP中实现这一目标?

4 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:0)

另一种方式

$input = 18000000;  

$length=strlen((string)$input);
$sum=0;
$numbers="";
while ($length>0) {     
    $number = $input % 10;
    $numbers.= $number;        
    $input = $input/10;
    $length--;
}
echo $numbers;

答案 2 :(得分:0)

我在搜索某些内容时偶然发现了这个答案,但我最终做了一些更简单的事情(因为我知道我的字符串总是会有一个前导零,如果有必要对齐两个字符边界):

$littlendian = join(array_reverse(str_split($bigendian), 2)));

显然,如果您的bigendian输入格式不是那么好,这个技巧不会直接起作用:)

答案 3 :(得分:0)

尝试一下:

$result=bin2hex( implode( array_reverse( str_split( hex2bin($src) ) ) ) );