16進位制資料發生高位位元組和地位位元組互換

weixin_34402408發表於2016-05-05

在我藍芽開發的時候,我從通過藍芽獲得裝置的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

相關文章