将主机字节序(小端)中的字符串转换为网络字节序(大端)。

3

我有一个十六进制字符串,它是以主机字节顺序(小端)表示的,如18000000。我需要将其转换为网络字节顺序(大端)表示。结果的十六进制字符串应该是00000018

简而言之,我需要将18000000转换为00000018

在PHP中如何实现?


你有尝试过什么吗? - undefined
我尝试使用strrev()函数,但是我得到了00000081 - undefined
4个回答

4
你可以使用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/zh/function.pack.php


1

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

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

很明显,如果您的大端输入格式不像那样良好,那么这个技巧就不能直接使用 :)

0

另一种方式

$input = 18000000;  

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

这个解决方案对于十六进制字符串(0A0B0C0D 字符串会产生错误)是无效的。 - undefined

0

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接