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