http://n3yang.com/archives/2011/12/16/php-function-ntohl/
http://www.w3school.com.cn/php/func_misc_unpack.asp // php unpack 函數
最近項目中使用到了PHP與C服務器的socket通信,在做數據轉換的時候,PHP沒有提供對應將網絡字節序和機器字節序相互轉換的程序,但是根據函數的意義,我們可以做相應的轉換來實現這一函數:
1 2 3 4 | function ntohl( $str ){
$arr = unpack( 'I' , pack( 'N' , $str ));
return $arr [1];
}
|
函數的意義
程序的作用是將網絡字節序和機器字節序進行相互轉換。在C/C++、Python、Delphi中都提供了相應的函數“ntohl”和“htonl”,如果是short類型就是“ntohs”和“htons”。下面是這些函數的意義:
ntohl()--"Network to Host Long" htonl()--"Host to Network Long" htons()--"Host to Network Short" ntohs()--"Network to Host Short"
什么是主機字節序
不同的機器字節序不相同,這與使用的CPU有關。不同的CPU在處理高位字節時所存儲的順序是不同的。
例如Intel x86結構下, short型數0×1234表示為34 12, int型數0×12345678表示為78 56 34 12
如IBM power PC結構下, short型數0×1234表示為12 34, int型數0×12345678表示為12 34 56 78
網絡字節序
正是由于每個主機的處理順序有可能不同,所以在網絡協議中規定數據從高到低順序存儲,目的是在不同架構的主機中可以正常通信,避免兼容性問題。