91夜夜人人揉人人捏人人添-91一区二区三区四区五区-91伊人久久大香线蕉-91在线电影-免费a网址-免费v片网站

當前位置:網站首頁 >> 作文 >> 不同坐標系之間的轉換方法優秀

不同坐標系之間的轉換方法優秀

格式:DOC 上傳日期:2023-04-25 17:51:09
不同坐標系之間的轉換方法優秀
時間:2023-04-25 17:51:09     小編:zdfb

在日常學習、工作或生活中,大家總少不了接觸作文或者范文吧,通過文章可以把我們那些零零散散的思想,聚集在一塊。寫范文的時候需要注意什么呢?有哪些格式需要注意呢?下面我給大家整理了一些優秀范文,希望能夠幫助到大家,我們一起來看一看吧。

不同坐標系之間的轉換方法篇一

引導語:網絡傳輸中,數據包與數據流的相互轉換都有哪些方法呢?以下是小編整理的包與流之間的轉換方法,歡迎參考閱讀!

這種辦法粗暴簡單,我們使用一個特殊字符來作為包與包之間的分隔符,不過這個分隔符要特殊,特殊到幾乎不出現在包的內容當中,否則會影響接收方切割包的過程。

作為發送方,我們可以用如下代碼(示意用):

#define kseparatorchar @"¤"

+ (nsstring*)encodetextpayload:(nsstring*)payload {

nsstring* str = [nsstring stringwithformat:@"%@%@", kseparatorchar, payload];

return str;

}

¤ 就是一個非常特殊的字符,一般應用層的文本都不會涉及到,所以可以用作我們的特殊分隔符。接收端只需要以 ¤ 為分隔符,再把數據做一次切割即可:

+ (nsstring*)decodetextpayloadstring:(nsstring*)str {

nsstring* payload;

nsarray* arr = [str componentsseparatedbystring:kseparatorchar];

if ( < 2) {

return nil;

}

payload = arr[1];

return payload;

}

這種做法的缺陷也是顯而易見的,必須嚴格要求包體中不會出現該特殊字符,所以這種辦法只能應用于非常特殊的場景。

這種辦法也是粗暴簡單,甚至不需要分隔符,每次接收方從 stream 中取出固定長度的字節,還原成一個包,代碼也比較簡單,在 receive() 回調里,每次檢查是否達到了固定的長度,是則取出固定長度還原,否則繼續等待,代碼就不演示啦。

這種做法的缺陷就更大了,會造成包體的浪費,無法適應不同大小的包。

之前一篇介紹自定義通訊協議的文章里,簡單的提到過如何設計一個可用的協議,這里我們具體看下代碼。

當我們需要描述可變長度的`包時,需要定義一個 header 來詳細描述包相關的信息,比如最簡單的,記錄包的長度。如何記錄包的大小呢?我們可以用位操作的特性,來將應用層的 int 值放入到包的 header 中,代碼如下(代碼摘自以前的項目,稍有改動):

- (nsdata*)encodedata:(nsdata*)data withheader:(nsstring*)header {

int datasize = (int);

char buffer[4];

buffer[0] = datasize >> 24;

buffer[1] = (datasize << 8) >> 24;

buffer[2] = (datasize << 16) >> 24;

buffer[3] = (datasize << 24) >> 24;

nsmutabledata* packet = [nsmutabledata new];

[packet appendbytes:[header utf8string] length:2];

[packet appendbytes:buffer length:4];

[packet appenddata:data];

return packet;

}

這是一個通用的技巧,當我們需要在 stream 中記錄可變長度的數據時,都可以用這種位操作來做轉換,只需要 2 個字節的長度,即可記錄長達 64 kb 的數據長度,4 個字節則能記錄長達 4 gb 的長度。

接收方在收到 nsdata 之后,可以先讀取 4 個字節的長度信息,還原成 int 值,再讀取 int 值所記錄的字節數,這些字節就是我們的包了,代碼如下:

- (tdecodeddata*)decodedata:(nsdata*)data {

tdecodeddata* d = [tdecodeddata new];

if ( < 6) { //minimal packet length

return nil;

}

if ([headerstr isequaltostring:kpacketstreamheader] == true) {

int realsize = 0;

unsigned char buffer[4];

[data getbytes:buffer range:nsmakerange(2, 4)];

realsize += buffer[0] << 24;

realsize += buffer[1] << 16;

realsize += buffer[2] << 8;

realsize += buffer[3] << 0;

if ( - 6 < realsize) {

return nil;

}

= kpacketstreamheader;

nsdata* payloadbytes = [data subdatawithrange:nsmakerange(6, realsize)];

if ( > 0) {

ddata = payloadbytes;

}

//remove from data

int handledlength = 6 + realsize;

nsdata* nd = [nsdata datawithbytes: + handledlength length:-handledlength];

ddata = nd;

}

return d;

}

上面的代碼主要是向大家展示,如何以添加 header 的方式,來記錄可變長度的包體信息。如此,發送方所發送的 nsdata 就和接收方所接受的 nsdata 一一對應起來了,就就不存在所謂的粘包和拆包問題了。

我們之所以可以對一個 stream 做切分,是因為 tcp 已經做了可靠傳輸的保證,接收方收到的 stream 和發送方發送的 stream 嚴格一致,一個字節都不會差,所以我們只需要先讀取長度值,再按長度值讀取后續的數據,就能把一個 stream 分割成一個個的 nsdata,這些分割好的 nsdata 就是發送方所發送的包了。

接收方將 stream 分割成 nsdata 之后,需要進一步將 data 反序列化成應用層的包,這里就必須提到 google 開源的 protobuf 了,序列化和反序列化神器,造福了無數的框架和應用,甚至有 objective c 的版本。

s("content_relate");

【包與流之間的轉換方法】相關文章:

java進制之間的轉換

10-01

word文件的轉換方法

10-06

php ascii碼與字符串相互轉換的方法

09-11

c語言中網絡地址與二進制數之間轉換

11-20

java中float類型的范圍及其與十六進制的轉換方法

11-28

php字母大小寫轉換的方法

08-21

java輸入數據流的方法有哪些

12-07

java中的stream流的解析與應用

12-01

c++中時間與時間戳的轉換

10-04

word表格中數據縱橫轉換的方法和技巧

09-21

全文閱讀已結束,如果需要下載本文請點擊

下載此文檔
a.付費復制
付費獲得該文章復制權限
特價:5.99元 10元
微信掃碼支付
已付款請點這里
b.包月復制
付費后30天內不限量復制
特價:9.99元 10元
微信掃碼支付
已付款請點這里 聯系客服
主站蜘蛛池模板: 午夜视频免费 成人 | 欧美视频一区二区三区 | 亚洲小视频在线播放 | 天天玩天天操 | 操操操网 | 图片专区亚洲色图 | 永久在线| 亚洲综合久久一本伊伊区 | 在线观看一区二区精品视频 | 国产亚洲一区二区精品张柏芝 | 国产精品欧美一区二区三区 | 最近的中文字幕视频完整 | 妞妞影视一二三区 | 一个人在线观看的免费视频www | 天堂网色 | 亚洲国产最新在线一区二区 | 色综合综合网 | 亚洲视频2| 日本成年免费网站 | 日本 欧美 国产 | 亚洲第一中文 | 免费视频99 | 91在线精品你懂的免费 | 欧美日韩中文一区二区三区 | 一级黄色片一 | 久久综合狠狠综合久久 | 青青青国产精品手机在线观看 | 久草综合视频在线 | www.国产精品 | 日韩伦理亚洲欧美在线一区 | 你懂的日韩 | 黄色的网站免费 | 亚洲欧美日韩精品一区 | 免费看h片网站 | 天天操天天操天天操天天操 | 97精品伊人久久久大香线蕉 | 日韩中文字幕一在线 | xxx日本免费 | 日本三级黄色录像 | 精品成人在线视频 | 久久精品国产屋 |