2017年下半年應公司需求要寫一個日志系統(tǒng)的SDK,日志上報協(xié)議使用TCP協(xié)議,通過長鏈接上報,格式如下:

當然我們這里不討論SDK的設計實現(xiàn),這里我們只討論網絡字節(jié)序(大端字節(jié)序)與小端字節(jié)序相互轉換的問題
首先我們要理解什么是大端模式,什么是小端模式?
大端模式:是指數(shù)據(jù)的高字節(jié)保存在內存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內存的高地址中
小端模式,是指數(shù)據(jù)的高字節(jié)保存在內存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內存的低地址中
具體的定義可以看這邊文章:大端、小端存儲模式概念
由于我的Mac電腦默認的是小端存儲模式,因此我需要進行大端的轉換,實現(xiàn)代碼如下,通過0xff進行位操作很簡單就實現(xiàn)了,代碼如下
- (NSData *)headDataFormat{
???
??? Byte byte[16];
???
??? byte[0] = (self.mPackageLength >> 24) & 0xff;
??? byte[1] = (self.mPackageLength >> 16) & 0xff;
??? byte[2] = (self.mPackageLength >> 8) & 0xff;
??? byte[3] = self.mPackageLength&0xff;
???
??? byte[4] = (self.mHeadLengh >> 8) & 0xff;
??? byte[5] = self.mHeadLengh & 0xff;
???
??? byte[6] = (self.mVersion >> 8) & 0xff;
??? byte[7] = self.mVersion & 0xff;
???
??? byte[8] = (self.mCommand >> 24) & 0xff;
??? byte[9] = (self.mCommand >> 16) & 0xff;
??? byte[10] = (self.mCommand >> 8) & 0xff;
??? byte[11] = self.mCommand & 0xff;
???
??? byte[12] = (self.mSessionId >> 24) & 0xff;
??? byte[13] = (self.mSessionId >> 16) & 0xff;
??? byte[14] = (self.mSessionId >> 8) & 0xff;
??? byte[15] = self.mSessionId & 0xff;
??? NSData *headData = [NSData dataWithBytes:byte length:sizeof(byte)];
??? OMSLogD(@"Head數(shù)據(jù):mPackageLength=%d,mHeadLengh=%d,mVersion=%d,mCommand=%d,mSessionId=%d",self.mPackageLength, self.mHeadLengh, self.mVersion, self.mCommand, self.mSessionId);
??? return headData;
}
通過byte數(shù)組,一個字節(jié)一個字節(jié)的轉換,這種方式對于剛剛接觸大端小端模式的我來說就比較好理解了;
同理,大端轉小端也可以使用這種方式,簡單易懂;