在线观看国产免费视频_亚洲视频三区_中文字幕在线观看网站_日韩视频免费在线观看_亚洲视频精品_天天夜夜操

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

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

格式: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元
微信掃碼支付
已付款請點這里 聯系客服
主站蜘蛛池模板: 美女视频网站色 | 久久99精品久久久久久久不卡 | 99久女女精品视频在线观看 | 天天操天天操天天射 | 成人黄色在线免费观看 | 日本高清视频一区二区三区 | 免费jjzz在线播放国产 | 一级免费a | 成年动漫3d无尽视频不卡 | 青草免费在线 | 日本在线观看一区 | 久久成人亚洲香蕉草草 | 99影视在线视频免费观看 | 国产成人精品免费久久久久 | 免费大片在线观看www | 欧美日韩免费一区二区在线观看 | 国产成人久久91网站下载 | 日本亚洲高清乱码中文在线观看 | 日韩亚洲一区中文字幕 | 免费国产一级特黄aa大 | 国产精品国产三级国产潘金莲 | 欧美aaaav免费大片 | 国产精品久久久久久吹潮 | h在线观看网站 | 欧美国产日韩一区二区三区 | 国产永久在线观看 | 和老师做爰动漫4在线看 | 中文精品99久久国产 | 久99久视频| 国产欧美一区二区久久 | 国产伦精品一区二区三区免费观看 | www国产91| 成人午夜毛片在线看 | 国产成人久久久精品一区二区三区 | 亚洲成色www久久网站 | 日韩一区二区三区四区区区 | 嫂子的职业在线看 | 全部免费毛片免费播放 | 无人视频在线观看完整版高清免费 | 国产99在线 | 变成黑皮辣妹后与朋友做了 |