Ios 将十六进制转换为NSString

Ios 将十六进制转换为NSString,ios,objective-c,cocoa-touch,nsstring,Ios,Objective C,Cocoa Touch,Nsstring,我通过以下方式转换为十六进制: NSString * hexStr = [NSString stringWithFormat:@"%@", [NSData dataWithBytes:[string cStringUsingEncoding:NSUTF8StringEncoding] length:strlen([string c

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

NSString * hexStr = [NSString stringWithFormat:@"%@",
                                  [NSData dataWithBytes:[string cStringUsingEncoding:NSUTF8StringEncoding] 
                                                 length:strlen([string cStringUsingEncoding:NSUTF8StringEncoding])]];
我从外语转换,所以每个字符现在是4字节的十六进制。 我曾尝试将其转换回nsstring,但(通过)未获得原始字符串


帮助:)

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

几个观察结果:

  • 将字符串转换为
    NSData
    的方法是使用incoding获取
    cstrings,然后将其用于
    dataWithBytes
    。这样做容易得多:

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

    NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
  • 您正在成功地使用
    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;
    }
    

    它是什么外语?试着看看这是否有帮助。UTF8字符可能需要1到6个字节之间的任何字符(或者其十六进制字符串表示形式介于2到12个字节之间)。例如,7位ASCII字符集之外的许多欧洲字符在UTF8中各占16位。许多阿拉伯字符也是如此。等等。不能仅从每个字符的字节数推断字符串编码。在本例中,OP使用的是
    NSUTF8StringEncoding
    ,因此我们知道它是UTF8,每个字符的字节数与此完全一致。
    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];