php字節(jié)序轉(zhuǎn)換的方法

發(fā)布時間:2024-03-10
php字節(jié)序轉(zhuǎn)換的方法:1、使用“htons”方法把unsigned short類型從主機序轉(zhuǎn)換到網(wǎng)絡(luò)序;2、使用“htonl”把“unsigned long”類型從主機序轉(zhuǎn)換到網(wǎng)絡(luò)序等。
推薦:《php視頻教程》
php主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序
使用php編寫socket程序時,也需要注意主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換
主機字節(jié)序就是我們平常說的大端和小端模式:不同的 cpu 有不同的字節(jié)序類型,這些字節(jié)序是指整數(shù)在內(nèi)存中保存的順序 這個叫做主機序。big-endian和little-endian。引用標準的big-endian和little-endian的定義如下:
a) little-endian就是低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。
b) big-endian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。
例子:在內(nèi)存中雙字0x01020304(dword)的存儲方式
內(nèi)存地址4000 4001 4002 4003le 04 03 02 01be 01 02 03 04網(wǎng)絡(luò)字節(jié)順序是指tcp/ip中規(guī)定好的一種數(shù)據(jù)表示格式,它與具體的cpu類型、操作系統(tǒng)等無關(guān),從而可以保證數(shù)據(jù)在不同主機之間傳輸時能夠被正確解釋。網(wǎng)絡(luò)字節(jié)順序采用big endian排序方式。字節(jié)序,顧名思義字節(jié)的順序,就是大于一個字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序,一個字節(jié)的數(shù)據(jù)沒有順序的問題了。
為了進行轉(zhuǎn)換 bsd socket 提供了轉(zhuǎn)換的函數(shù) 有下面四個
htons 把 unsigned short 類型從主機序轉(zhuǎn)換到網(wǎng)絡(luò)序
htonl 把 unsigned long 類型從主機序轉(zhuǎn)換到網(wǎng)絡(luò)序
ntohs 把 unsigned short 類型從網(wǎng)絡(luò)序轉(zhuǎn)換到主機序
ntohl 把 unsigned long 類型從網(wǎng)絡(luò)序轉(zhuǎn)換到主機序
在使用 little endian 的系統(tǒng)中 這些函數(shù)會把字節(jié)序進行轉(zhuǎn)換
在使用 big endian 類型的系統(tǒng)中 這些函數(shù)會定義成空宏
注意:
1 、網(wǎng)絡(luò)與主機字節(jié)轉(zhuǎn)換函數(shù) :htons ntohs htonl ntohl (s 就是 short l 是 long h 是 host n 是 network)
2 、不同的 cpu 上運行不同的操作系統(tǒng),字節(jié)序也是不同的
在網(wǎng)絡(luò)程序開發(fā)時 或是跨平臺開發(fā)時 也應該注意保證只用一種字節(jié)序 不然兩方的解釋不一樣就會產(chǎn)生bug.
php中并沒提供htons,htonl功能的函數(shù),在進行網(wǎng)絡(luò)通信時,可以通過
string pack ( string $format [, mixed $args [, mixed $... ]] )array unpack ( string $format , string $data )進行編解碼
其中,format 可以取下面的值:
code descriptiona nul-padded stringa space-padded stringh hex string, low nibble firsth hex string, high nibble firstc signed charc unsigned chars signed short (always 16 bit, machine byte order)s unsigned short (always 16 bit, machine byte order)n unsigned short (always 16 bit, big endian byte order)v unsigned short (always 16 bit, little endian byte order)i signed integer (machine dependent size and byte order)i unsigned integer (machine dependent size and byte order)l signed long (always 32 bit, machine byte order)l unsigned long (always 32 bit, machine byte order)n unsigned long (always 32 bit, big endian byte order)v unsigned long (always 32 bit, little endian byte order)f float (machine dependent size and representation)d double (machine dependent size and representation)x nul bytex back up one bytez nul-padded string (new in php 5.5)@ nul-fill to absolute position網(wǎng)絡(luò)通信
比如現(xiàn)在要通過php發(fā)送數(shù)據(jù)包到服務(wù)器來登錄。在僅需要提供用戶名(最多30個字節(jié))和密碼(md5之后固定為32字節(jié))的情況下,可以構(gòu)造如下數(shù)據(jù)包(當然這事先需要跟服務(wù)器協(xié)商好數(shù)據(jù)包的規(guī)范,本例以網(wǎng)絡(luò)字節(jié)序通信):
包結(jié)構(gòu):
字段 字節(jié)數(shù) 說明包頭 定長 每一個通信消息必須包含的內(nèi)容包體 不定長 根據(jù)每個通信消息的不同產(chǎn)生變化其中包頭詳細內(nèi)容如下:
字段 字節(jié)數(shù) 類型 說明pkg_len 2 ushort 整個包的長度,不超過4kversion 1 uchar 通訊協(xié)議版本號command_id 2 ushort 消息命令idresult 2 short 請求時不起作用;請求返回時使用當然實際中可能會涉及到各種校驗。本文為了簡單,只是列舉一下通常的工作流程及處理的方式。
登錄(執(zhí)行命儲1001)
字段 字節(jié)數(shù) 類型 說明用戶名 30 uchar[30] 登錄用戶名密碼 32 uchar[32] 登錄密碼包頭是定長的,通過計算可知包頭占7個字節(jié),并且包頭在包體之前。比如用戶陳一回需要登錄,密碼是123456,則代碼如下:
<?php$version = 1;$result = 0;$command_id = 1001;$username = "陳一回";$password = md5("123456");// 構(gòu)造包體$bin_body = pack("a30a32", $username, $password);// 包體長度$body_len = strlen($bin_body);$bin_head = pack("ncns", $body_len, $version, $command_id, $result); //result為什么使用了主機字節(jié)序$bin_data = $bin_head . $bin_body;// 發(fā)送數(shù)據(jù)// socket_write($socket, $bin_data, strlen($bin_data));// socket_close($socket);
上一個:amd3+(amdr3系列)
下一個:三星s5玩游戲怎么樣,三星note20ultra玩游戲怎么樣

大蔥反季節(jié)種植技術(shù)要點
德國易福門ifm電容器式感應器kg5309
辦理協(xié)議離婚都要帶什么
甲方工程管理的特點與創(chuàng)新,一定要了解!
結(jié)婚戒指應該誰買
人到中年,遠離煙酒,以茶為友
小米手機怎么更新miui7穩(wěn)定版,小米note如何升級到miui7
2021年手機處理器性能排行榜(手機處理器性能排行榜202011月)
選購恒溫搖床2條至關(guān)重要的參數(shù)你知道嗎?
盆栽榕樹落葉的防治方法
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos