我有一個十六進制字符串讀取18000000
這個字符串是主機字節順序(小尾數),我需要將其轉換爲網絡字節順序(Big endian)。得到的十六進制字符串將是00000018
。在主機字節順序(小尾數)轉換字符串到網絡字節順序(大尾數)
總之我需要轉換 18000000 to 00000018
如何在PHP中實現這一目標?
我有一個十六進制字符串讀取18000000
這個字符串是主機字節順序(小尾數),我需要將其轉換爲網絡字節順序(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
謝謝你的工作 – Saad
另一種方式
$input = 18000000;
$length=strlen((string)$input);
$sum=0;
$numbers="";
while ($length>0) {
$number = $input % 10;
$numbers.= $number;
$input = $input/10;
$length--;
}
echo $numbers;
這個解決方案對於HEX字符串將不起作用('0A0B0C0D'字符串會產生錯誤) – krlv
我只是無意中發現這個答案,而尋找的東西,但我最終做了很多簡單的事情(S因斯我知道我的弦總是要有一個前導零,如果有必要對準兩個字符的邊界):
$littlendian = join(array_reverse(str_split($bigendian), 2)));
顯然,如果你的大尾端輸入格式不正確這樣的,這一招是不會直接工作:)
你到目前爲止嘗試過什麼嗎? – bfontaine
我試過strrev(),但是我得到'00000081' – Saad