2016-06-08 75 views
0

我有一個十六進制字符串像「000000000100」,我使用以下邏輯來做ASCII轉換,我收到的輸出只有一個字節(\ x01)但我希望輸出在6字節格式爲\ x00 \ x00 \ x00 \ x00 \ x01 \ x00轉換十六進制字符串爲ASCII格式

-(NSString*) decode 
{ 
    [email protected]"000000000100"; 
    NSMutableString * newString = [[NSMutableString alloc]init]; 
    int i = 0; 
    while (i < [string length]) 
    { 
    NSString * hexChar = [string substringWithRange: NSMakeRange(i, 2)]; 
    int value = 0; 
    sscanf([hexChar cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value); 
    [newString appendFormat:@"%c", (char)value]; 
    i+=2; 
    } 
return newString; 

} 

如何做到這一點?

+0

但我想傳遞一個字符串 – stacker

+0

這裏是我的回答如此http://stackoverflow.com/a/37702822/6124910 – Patrick

回答

0

讓我們先來直接解決您的錯誤:在你的代碼嘗試下一個字節與添加到您的字符串:

[newString appendFormat:@"%c", (char)value]; 

您的問題是%c產生什麼如果字符是一個空的,所以您正在附加一個空字符串,並且您發現最終會得到一個帶有單字節的字符串。

您可以通過測試空和附加包含單個空字符串解決您的代碼:

if (value == 0) 
    [newString appendString:@"\0"]; // append a single null 
else 
    [newString appendFormat:@"%c", (char)value]; 

第二,這是做到這一點的呢?

其他答案向您展示了其他算法,它們可能比您的算法效率更高,因爲它們只是一次轉換爲C字符串,而不是反覆提取子字符串並逐個轉換每個算法。

當且僅當性能是一個真正的問題,你可能希望考慮這種基於C的解決方案。您清楚知道如何使用scanf,但在這種簡單的情況下,您可能需要查看digittoint並自己將兩個十六進制數字轉換爲整數(第一個* 16的值+第二個值)。

相反,如果你想避免C和scanf看看NSScannerscanHexInt/scanHexLongLong - 如果你的字符串超過16個十六進制數字永遠不再可以將整個字符串從字節轉換一氣呵成,然後產生一個NSString結果無符號的64位整數。

HTH

相關問題