iOS藍芽中的進製轉換

2021-10-07 16:53:02 字數 3250 閱讀 5465

最近在忙乙個藍芽專案,在處理藍芽資料的時候,經常遇到進製之間的轉換,藍芽處理的是16進製制(nsdata),而我們習慣的計數方式是10進製,為了節省空間,藍芽也會把16進製制(nsdata)拆成2進製記錄。這裡我們研究下如何在他們之間進行轉換。

假設我們要向藍芽傳送0x1b9901這條資料

byte value[3]=;

value[0]=0x1b;

value[1]=0x99;

value[2]=0x01;

nsdata * data = [nsdata datawithbytes:&value length:sizeof(value)];

//傳送資料

[self.peripheral writevalue:data forcharacteristic:self.write type:cbcharacteristicwritewithoutresponse];

複製**

- (nsdata *)hextobytes:(nsstring *)str

return data;

}//傳送資料

[self.peripheral writevalue:[self hextobytes:@"1b9901"] forcharacteristic:self.write type:cbcharacteristicwritewithoutresponse];

複製**

接下來**下傳送的資料需要計算的情況。 最常用的傳送資料需要計算的場景是求__校驗和(checksum)__。這個根據硬體廠商來定,常見的求校驗和的規則有:

如果我要傳送帶上校驗和的0x1b9901,方法就是:

- (nsdata *)getchecksum:(nsstring *)bytestr

nsstring *str = [nsstring stringwithformat:@"%@%@",bytestr,[self tohex:at]];

return [self hextobytes:str];

}//將十進位制轉化為十六進製制

- (nsstring *)tohex:(int)tmpid

if (tmpid == 0)

}//不夠乙個位元組湊0

if(str.length == 1)else

}//傳送資料

nsdata *data = [self getchecksum:@"1b9901"];//data=<1b99014b>

[self.peripheral writevalue:data forcharacteristic:self.write type:cbcharacteristicwritewithoutresponse];

複製**

這種是比較麻煩的,舉個栗子:在傳輸某條資訊時,我想把時間放進去,不能用時間戳,還要節省空間,這樣就出現了一種新的方式儲存時間。 這裡再補充一些c語言知識:

儲存時間的條件是:

這樣直觀的解決辦法就是分別取出現在時間的年月日時分星期,先轉成2進製,再轉成16進製制發出去。當然你這麼寫進去,讀的時候就要把16進製制資料先轉成2進製再轉成10進製顯示。我們就按這個簡單粗暴的思路來,準備工作如下:

//十進位制轉二進位制

- (nsstring *)tobinarysystemwithdecimalsystem:(int)num length:(int)length

}//倒序輸出

nsstring * result = @"";

for (int i = length -1; i >= 0; i --)else

}return result;

}複製**

// 二進位制轉十進位制

- (nsstring *)todecimalwithbinary:(nsstring *)binary

nsstring * result = [nsstring stringwithformat:@"%d",ll];

return result;

}複製**

- (nsstring *)getbinarybyhex:(nsstring *)hex binary:(nsstring *)binary

}else}}

}return binarystring;

}複製**

有了這幾種轉換函式,完成上面的功能就容易多了,具體怎麼操作這裡就不寫一一出來了。但總感覺怪怪的,這麼乙個小功能怎麼要寫這麼一大堆**,當然還可以用c語言的方法去解決。這裡主要是為了展示ios中資料如何轉換,c語言的實現方法這裡就不寫了,有興趣的同學可以研究下。

int轉nsdata

- (nsdata *) setid:(int)id 

複製**

nsdata轉int接受到的資料0x00000a0122

//4位元組表示的int

nsdata *intdata = [data subdatawithrange:nsmakerange(2, 4)];

int value = cfswapint32bigtohost(*(int*)([intdata bytes]));//655650

//2位元組表示的int

nsdata *intdata = [data subdatawithrange:nsmakerange(4, 2)];

int value = cfswapint16bigtohost(*(int*)([intdata bytes]));//290

//1位元組表示的int

char *bs = (unsigned

char *)[[data subdatawithrange:nsmakerange(5, 1) ] bytes];

int value = *bs;//34

複製**

//補充內容,因為沒有三個位元組轉int的方法,這裡補充乙個通用方法

- (unsigned)parseintfromdata:(nsdata *)data

複製**

這兩個轉換在某些場景下使用頻率也是挺高的,藍芽裡面的資料轉換基本也就這麼多了,希望能夠幫助大家。 更多關於位元組編碼的問題,大家可以點這裡:傳送門

基於corebluetooth4.0框架的連線ble4.0的demo:你不點一下嗎

iOS藍芽中的進製轉換

最近在忙乙個藍芽專案,在處理藍芽資料的時候,經常遇到進製之間的轉換,藍芽處理的是16進製制 nsdata 而我們習慣的計數方式是10進製,為了節省空間,藍芽也會把16進製制 nsdata 拆成2進製記錄。這裡我們研究下如何在他們之間進行轉換。假設我們要向藍芽傳送0x1b9901這條資料 byte v...

iOS藍芽中的進製轉換

字數1731 閱讀281 喜歡5 最近在忙乙個藍芽專案,在處理藍芽資料的時候,經常遇到進製之間的轉換,藍芽處理的是16進製制 nsdata 而我們習慣的計數方式是10進製,為了節省空間,藍芽也會把16進製制 nsdata 拆成2進製記錄。這裡我們研究下如何在他們之間進行轉換。假設我們要向藍芽傳送0x...

iOS開發中的進製轉換

生活中最常用的是十進位制,所以進製轉換總的可以分為兩大類 第一類 其他進製 如二進位制 十六進製制 轉十進位制 第二類 十進位制轉其他進製 如二進位制 十六進製制 1 拋開進製的觀念,數值都可以寫成這種形式 x.x,因為進製的不同,導致每一位代表的數值不同,也就是 進製 和 位置 組成了不同的數值 ...