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

问题描述 投票:0回答:4

我有一个十六进制字符串,其内容为

18000000
此字符串采用主机字节顺序(小端),我需要将其转换为网络字节顺序(大端)。生成的十六进制字符串将为
00000018

总结一下我需要转换

18000000 to 00000018

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

php string hex endianness
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/en/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;

0
投票

试试这个:

$result=bin2hex( implode( array_reverse( str_split( hex2bin($src) ) ) ) );
© www.soinside.com 2019 - 2024. All rights reserved.