ios - 将十六进制转换为NSString

标签 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?)。

帮帮我 :)

最佳答案

一些观察:

  • 通过获取NSData然后再将其用于cStringUsingEncoding的将字符串转换为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;
    }
    

  • 因此,将所有这些放在一起
    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];
    

    关于ios - 将十六进制转换为NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20823478/

    相关文章:

    objective-c - 您如何检测 UILabel 在 Cocoa Touch 中包含从右到左的语言?

    ios - AssetLibrary - 如何加载方向校正?

    ios - containerAppExtensionEntitlementsWithCompletion 失败,错误为 : (null)

    ios - 安装Youtube iOS应用后,Metarefresh失败

    iphone - 在 IOS 应用程序中,我必须在哪个文件夹中保存数据文件?

    objective-c - @synthesized 实例变量的可见性是什么?

    ios - YouTube HTML5 API 回调的时间分辨率是多少?

    objective-c - 从 NSString 解析 NSDate 时出错

    javascript - iOS 中的 MultiMarkdown 到 HTML

    objective-c - 如何在 Interface Builder 中更改 UIView 大小