将hex转换为NSString

时间:2013-12-29 08:35:58

标签: ios objective-c cocoa-touch nsstring

我通过以下方式转换为十六进制:

NSString * hexStr = [NSString stringWithFormat:@"%@",
                                  [NSData dataWithBytes:[string cStringUsingEncoding:NSUTF8StringEncoding] 
                                                 length:strlen([string cStringUsingEncoding:NSUTF8StringEncoding])]];

我从外语转换,所以每个字符现在是十六进制的4个字节。 我试图将它转换回nsstring但我没有得到原始字符串(How to convert HEX to NSString in Objective-C?)。

帮助:)

2 个答案:

答案 0 :(得分:3)

有几点意见:

  1. 通过获取NSData然后将其用于cStringUsingEncoding将字符串转换为dataWithBytes的技术有点间接。它更容易做到:

    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    
  2. 如果您想将NSData转换回NSString,您可以执行以下操作:

    NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
  3. 您已成功使用stringWithFormat创建NSData的十六进制字符串表示形式。现在问题是如何将该十六进制字符串表示转换回NSData。很多技术,但这是一个例行程序:

    - (NSData *)dataFromHexString:(NSString *)originalHexString
    {
        NSString *hexString = [originalHexString stringByReplacingOccurrencesOfString:@"[ <>]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [originalHexString length])]; // strip out spaces (between every four bytes), "<" (at the start) and ">" (at the end)
        NSMutableData *data = [NSMutableData dataWithCapacity:[hexString length] / 2];
        for (NSInteger i = 0; i < [hexString length]; i += 2)
        {
            NSString *hexChar = [hexString substringWithRange: NSMakeRange(i, 2)];
            int value;
            sscanf([hexChar cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value);
            uint8_t byte = value;
            [data appendBytes:&byte length:1];
        }
    
        return data;
    }
    
  4. 所以,把这一切放在一起,到

    NSString *string          = @"こんにちは、世界。";
    NSData   *data            = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSString *hexString       = [NSString stringWithFormat:@"%@", data];
    NSData   *resultingData   = [self dataFromHexString:hexString];
    NSString *resultingString = [[NSString alloc] initWithData:resultingData encoding:NSUTF8StringEncoding];
    

答案 1 :(得分:0)

每个字符是十六进制的4个字节?这意味着它实际上是四个半字节,所以它不是UTF 8而是UTF 16。