16進位制資料發生高位位元組和地位位元組互換
在我藍芽開發的時候,我從通過藍芽獲得裝置的16進位制資料流時,發生了高位位元組和低位位元組互換的情況,導致我解析的unicode資料是亂碼。
舉例:
\u9065表示“遙”,但是因為資料傳輸時發生了高位和低位的轉換,所以我收到的實際是\u6590,解碼出來的文字變成了“斐”。
解決辦法
//這是我獲取的有效的資料流
NSString *dataString = @"6590dc8f2e006d007000330000000";
[self decodingHiloUnicodeData:dataString];
- (NSString *)decodingHiloUnicodeData:(NSString *)hexStr{
NSMutableArray * hexArray = [[NSMutableArray alloc] init];
//4位16進位制資料表示一個字元,預設最後不滿4位的16進位制資料放一起
for (int i=0; i<ceil(hexStr.length/4.0); i++) {
NSString *subString;
if (i==ceil(hexStr.length/4.0)-1) {
subString = [hexStr substringFromIndex:i*4];
}
else{
subString = [hexStr substringWithRange:NSMakeRange(i*4, 4)];
}
[hexArray addObject:subString];
}
[hexArray enumerateObjectsUsingBlock:^(NSString * _Nonnull string, NSUInteger idx, BOOL * _Nonnull stop) {
//最後不滿4位的不管
if (string.length==4) {
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
for (int i=0; i<string.length/2; i++) {
NSString *subString = [string substringWithRange:NSMakeRange(i*2, 2)];
[tempArray addObject:subString];
}
//一個字元的兩個位元組位置互換
[tempArray exchangeObjectAtIndex:0 withObjectAtIndex:1];
NSString *tempString = [NSString stringWithFormat:@"%@%@",tempArray[0],tempArray[1]];
[hexArray replaceObjectAtIndex:idx withObject:tempString];
}
}];
NSString *hexString = @"" ;
for (NSString *string in hexArray) {
hexString = [hexString stringByAppendingString:string];
}
NSData *mydata = [self hexToBytes:hexString];
NSString *finalString = [[NSString alloc] initWithData:mydata encoding:NSUnicodeStringEncoding];
return finalString;
}
/**
* 將16進位制的字串轉化為data資料
*
* @param str @"90658fdc002e006d0070003300000"
*
* @return <90658fdc 002e006d 00700033 0000>
*/
-(NSData *)hexToBytes:(NSString *)str{
NSMutableData* data = [NSMutableData data];
int idx;
for (idx = 0; idx+2 <= str.length; idx+=2) {
NSRange range = NSMakeRange(idx, 2);
NSString* hexStr = [str substringWithRange:range];
NSScanner* scanner = [NSScanner scannerWithString:hexStr];
unsigned int intValue;
[scanner scanHexInt:&intValue];
[data appendBytes:&intValue length:1];
}
return data;
}
輸出:
遙遠.mp3
相關文章
- 16進位制字串轉位元組字串
- python以16進位制列印位元組陣列Python陣列
- 位,位元組,二進位制,十六進位制間的關係
- 使用Apache的Hex類實現Hex(16進位制字串和)和位元組陣列的互轉Apache字串陣列
- 位,位元組,16進位制關係,以防忘記(給自己看的)
- c# 主機和網路位元組序的轉換 關於網路位元組序和主機位元組序的轉換C#
- 以高位元組地址為字地址是什麼
- .NET刪除位元組陣列中的0位元組陣列
- 位元組編碼轉換
- 漢字-字母-位元組-位之間的轉換
- modbus和位元組序
- printf列印16進位制資料,高位補零的方法。
- jvm位元組碼和類載入機制JVM
- 深入理解前端位元組二進位制知識以及相關API前端API
- 為什麼分庫分表使用2的N次方 一個位元組用兩位16進位制
- 字元,位元組和編碼字元
- 位元組遊戲測試 (外包崗位)遊戲
- 第五篇:主機位元組序與網路位元組序的轉換
- 計算機程式的思維邏輯 (57) - 二進位制檔案和位元組流計算機
- 網路通訊時位元組序轉換原理與網路位元組序、大端和小端模式模式
- 採用exp匯入zhs16gbk雙位元組字元到utf8三位元組字元字元
- Java 位元組碼Java
- 理解位元組序
- 位元組對齊
- 10進位制和16進位制互轉的例子
- 位(bit/b)、位元組(byte/B)、字元字元
- 位元組跳動的16款重度遊戲遊戲
- 從 unicode 到位元組的轉換Unicode
- [Java SE] 經典問題:超出Java Long型(8位元組/64位)的二進位制位元流資料如何進行大數的數值計算?Java
- Python 十進位制轉換為二進位制 高位補零Python
- 位運算實現整數與位元組陣列轉換陣列
- C printf按8進位制、10進位制、16進位制輸出以及高位補0
- 位元組跳動近日申請多個“位元組遊戲”商標遊戲
- Oracle直方圖 32位元組限制Oracle直方圖
- 讓Google Chrome崩潰?只需16個位元組!GoChrome
- 位元組碼基礎
- JS 位元組流 解析JS
- 位元組陣列流陣列