2016-11-27 130 views
0

我有一個十六進制字符串讀取18000000這個字符串是主機字節順序(小尾數),我需要將其轉換爲網絡字節順序(Big endian)。得到的十六進制字符串將是00000018在主機字節順序(小尾數)轉換字符串到網絡字節順序(大尾數)

總之我需要轉換 18000000 to 00000018

如何在PHP中實現這一目標?

+0

你到目前爲止嘗試過什麼嗎? – bfontaine

+0

我試過strrev(),但是我得到'00000081' – Saad

回答

0

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

+0

謝謝你的工作 – Saad

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

這個解決方案對於HEX字符串將不起作用('0A0B0C0D'字符串會產生錯誤) – krlv

0

我只是無意中發現這個答案,而尋找的東西,但我最終做了很多簡單的事情(S因斯我知道我的弦總是要有一個前導零,如果有必要對準兩個字符的邊界):

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

顯然,如果你的大尾端輸入格式不正確這樣的,這一招是不會直接工作:)

相關問題