字數1731
閱讀281
喜歡5
最近在忙乙個藍芽專案,在處理藍芽資料的時候,經常遇到進製之間的轉換,藍芽處理的是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
這兩個轉換在某些場景下使用頻率也是挺高的,藍芽裡面的資料轉換基本也就這麼多了,希望能夠幫助大家。
更多關於位元組編碼的問題,大家可以點這裡:傳送門
iOS藍芽中的進製轉換
最近在忙乙個藍芽專案,在處理藍芽資料的時候,經常遇到進製之間的轉換,藍芽處理的是16進製制 nsdata 而我們習慣的計數方式是10進製,為了節省空間,藍芽也會把16進製制 nsdata 拆成2進製記錄。這裡我們研究下如何在他們之間進行轉換。假設我們要向藍芽傳送0x1b9901這條資料 byte v...
iOS藍芽中的進製轉換
最近在忙乙個藍芽專案,在處理藍芽資料的時候,經常遇到進製之間的轉換,藍芽處理的是16進製制 nsdata 而我們習慣的計數方式是10進製,為了節省空間,藍芽也會把16進製制 nsdata 拆成2進製記錄。這裡我們研究下如何在他們之間進行轉換。假設我們要向藍芽傳送0x1b9901這條資料 byte v...
iOS開發中的進製轉換
生活中最常用的是十進位制,所以進製轉換總的可以分為兩大類 第一類 其他進製 如二進位制 十六進製制 轉十進位制 第二類 十進位制轉其他進製 如二進位制 十六進製制 1 拋開進製的觀念,數值都可以寫成這種形式 x.x,因為進製的不同,導致每一位代表的數值不同,也就是 進製 和 位置 組成了不同的數值 ...