最近專案使用位元組流的方式傳輸資料,資料報中包含資料的大小等相關的一些基礎資訊需要將位元組轉換成網路位元組流的方式進行傳輸,因為之前一直使用的是http或者用分隔符的方式去解決socket傳輸中引起的粘包問題,第一次接觸網路位元組流的概念.後來查詢才知道原來對於不同的系統和不同的cpu中轉換相同的資料可能大端和小端在位元組的排序是不一致的,為了保持統一,出來了乙個網路位元組流的標準。
在ios中是有自帶的方法去進行轉換的,但是在使用的時候要注意轉換所要求的長度。
#define ntohl(x) (x) = ntohl((__uint32_t)x) //轉換成本地位元組流
#define ntohs(x) (x) = ntohs((__uint16_t)x) //轉換成本地位元組流
#define ntohll(x) (x) = ntohll((__uint64_t)x) //轉換成本地位元組流
#define htonl(x) (x) = htonl((__uint32_t)x) //轉換成網路位元組流
#define htons(x) (x) = htons((__uint16_t)x) //轉換成網路位元組流
#define htonll(x) (x) = htonll((__uint64_t)x) //轉換網路位元組流
//htonl 轉換成網路位元組序當接收到伺服器返回資料的時候記得要轉成本地位元組序.int32_t packetlength = 0;
int16_t headerlength = 0;
int16_t version = 1;
int32_t commandid = cmd_id_auth_token_req;
int32_t seqno = 1;
htonl(commandid);
nsdata *commondata = [nsdata datawithbytes:&commandid length:sizeof(commandid)];
htons(version);
nsdata *versiondata = [nsdata datawithbytes:&version length:sizeof(version)];
htonl(seqno);
nsdata *seqnodata = [nsdata datawithbytes:&seqno length:sizeof(seqno)];
headerlength = versiondata.length + commondata.length + seqnodata.length;
htons(headerlength);
nsdata *headerdata = [nsdata datawithbytes:&headerlength length:sizeof(headerlength)];
packetlength = ntohs(headerlength) + headerdata.length+filedata.length;
htonl(packetlength);
nsdata *packetlengthdata = [nsdata datawithbytes:&packetlength length:sizeof(packetlength)];
nsmutabledata *mdata = [nsmutabledata data];
python 網路位元組序轉換 網路位元組序
一.位元組序 位元組序是由於不同的主處理器和作業系統,對大於乙個位元組的變數在記憶體中的存放順序不同而產生的。位元組序通常有大端位元組序列和小端位元組序兩種分類方法。由於主機的千差萬別,主機的位元組序不能做到統一,但是網路上傳輸的數值,它們有統一的規定。網路位元組序 是指多位元組變數在網路傳輸時的表...
網路位元組順序與主機位元組順序轉換
網路位元組順序與主機位元組順序轉換 在進行網路程式設計時,由於網路位元組的順序和主機的位元組順序可能存在不同,需要進行轉換以統一 格式 網路位元組順序是tcp ip中規定好的一種資料表示格式,它與具體的cpu型別 作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用...
主機位元組序和網路位元組序轉換
為什麼要轉換?主機位元組序 整數在記憶體中儲存的順序,不同的處理器對應不容的模式 little endian 將低序位元組儲存在起始位址 big endian 將高序位元組儲存在起始位址 網路位元組序 整數在網路中的傳送順序 網路位元組順序是tcp ip中規定好的一種資料表示格式,它與具體的cpu型...