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進位制字串轉位元組字串
- 位元組流轉16進位制字串字串
- python以16進位制列印位元組陣列Python陣列
- 位、位元組和字
- 位、位元組、字
- 以高位元組地址為字地址是什麼
- 資料轉換-16進位制字元字元
- 為什麼分庫分表使用2的N次方 一個位元組用兩位16進位制
- 轉換協議位元組協議
- 漢字-字母-位元組-位之間的轉換
- Response響應位元組資料
- C printf按8進位制、10進位制、16進位制輸出以及高位補0
- Python 十進位制轉換為二進位制 高位補零Python
- jvm位元組碼和類載入機制JVM
- 深入理解前端位元組二進位制知識以及相關API前端API
- modbus和位元組序
- 【C/C++】5.位元組對齊和位元組填充C++
- [Java SE] 經典問題:超出Java Long型(8位元組/64位)的二進位制位元流資料如何進行大數的數值計算?Java
- 位(bit/b)、位元組(byte/B)、字元字元
- 位元組流
- 位元組碼
- 從 unicode 到位元組的轉換Unicode
- 位元組跳動的16款重度遊戲遊戲
- Unicode編碼 - 代理區和4位元組codePointUnicode
- 位運算實現整數與位元組陣列轉換陣列
- 位元組遊戲測試 (外包崗位)遊戲
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- Python的文字和位元組序列Python
- 【位元組跳動】【上海】iOS開發實習生招聘iOS
- 【位元組跳動】【上海】Android開發實習生招聘Android
- 【位元組跳動】【上海】前端開發實習生招聘前端
- 位元組碼指令
- Java 位元組碼Java
- 寬位元組注入
- 計算機中的編碼和字符集:理解二進位制、位元組流和常見編碼方案計算機
- python--進位制轉換和資料交換Python
- 位元組跳動入股《芒果鬥地主》開發商林子互娛
- 位元組跳動和TikTok內推
- 什麼是位元組碼?python位元組碼詳細介紹!Python