Swift3 将字符串值转换为十六进制字符串

Posted

技术标签:

【中文标题】Swift3 将字符串值转换为十六进制字符串【英文标题】:Swift3 convert string value to hexadecimal string 【发布时间】:2016-11-15 08:49:24 【问题描述】:

我是 Swift 新手,我想将字符串转换为十六进制字符串。我找到了一个Objective-C函数把一个字符串转成十六进制。

NSString * str = @"Say Hello to My Little Friend";

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

for (NSString * toRemove in [NSArray arrayWithObjects:@"<", @">", @" ", nil])
    hexString = [hexString stringByReplacingOccurrencesOfString:toRemove withString:@""];

NSLog(@"hexStr:%@", hexString);

现在我无法在 Swift 中转换此函数。目前我正在使用 Swift3。

请有人可以为我做这件事吗?

【问题讨论】:

使用if let strData = str.data(using: .utf8) /* ... */ 构造一个Data 实例,然后使用this answer 中的Data 扩展来获取表示为十六进制编码字符串(let hexStr = strData.hexEncodedString()) 的数据。 【参考方案1】:

这会产生与 ObjC 版本相同的输出

let str = "Say Hello to My Little Friend"
let data = Data(str.utf8)
let hexString = data.map String(format:"%02x", $0) .joined()

【讨论】:

我已经看到 str.data(using: .utf8) 的显式展开 (!) 也用于 String -> Data 转换的其他答案。我们知道data(..) 方法永远不会失败吗? @dfri 我们知道向我的小朋友问好永远不会失败。 这对于所有非空的String 实例是否普遍正确,或者您是否碰巧知道哪种字符串可能会失败? 即使是空字符串也会成功。我不确定,但我猜任何人类可读的文本都是 UTF8 兼容的。 是啊,好像和CFStringCreateWithBytes(_:_:_:_:_:)NULLreturn(详见swift-corelibs-foundation/Foundation/NSString.swift)有关,一个相当不确定的return case,"或者NULLif创建对象时出现问题。”。我不知道什么会产生“创建对象的问题” :)【参考方案2】:

详情

Xcode 11.2.1 (11B500)、Swift 5.1

解决方案

extension String 
    func toHexEncodedString(uppercase: Bool = true, prefix: String = "", separator: String = "") -> String 
        return unicodeScalars.map  prefix + .init($0.value, radix: 16, uppercase: uppercase)  .joined(separator: separator)
    

用法

let str = "Hello, playground"
print(str.toHexEncodedString())                                                 // 48656C6C6F2C20706C617967726F756E64
print(str.toHexEncodedString(uppercase: false, prefix: "0x", separator: " "))   // 0x48 0x65 0x6c 0x6c 0x6f 0x2c 0x20 0x70 0x6c 0x61 0x79 0x67 0x72 0x6f 0x75 0x6e 0x64

【讨论】:

【参考方案3】:

像这样将你的字符串转换为 NSData。

let myString = "ABCDEF"
let data = myString.dataUsingEncoding(NSUTF8StringEncoding)

然后使用以下方法将 NSData 转换为十六进制字符串 -

func hexFromData(data:NSData) -> String 
    let p = UnsafePointer<UInt8>(data.bytes)
    let len = data.length
    var str: String = String()
    for i in 0...len-1 
        str += String(format: "%02.2X", p[i])
    
    return str

希望这会有所帮助。

【讨论】:

NSData 在 Swift 3 中已过时【参考方案4】:

请试试这个,

let string = "Say Hello to My Little Friend"
let data = string.dataUsingEncoding(NSUTF8StringEncoding)
print(data)

它的输出是:

  Optional(<53617920 48656c6c 6f20746f 204d7920 4c697474 6c652046 7269656e 64>)

【讨论】:

【参考方案5】:

斯威夫特 3

let string = "Hello World!"
let data = string.data(using: String.Encoding.utf8)

let hexString = data?.hex


extension Data 

var hex: String 
        var string = ""

        #if swift(>=3.1)
            enumerateBytes  pointer, index, _ in
                for i in index..<pointer.count 
                    string += String(format: "%02x", pointer[i])
                
            
        #else
            enumerateBytes  pointer, count, _ in
                for i in 0..<count 
                    string += String(format: "%02x", pointer[i])
                
            
        #endif

        return string
    



【讨论】:

你能提供一些细节吗?

以上是关于Swift3 将字符串值转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

将字符串值转换为uint(十六进制)[重复]

如何将十六进制字符串转换为十进制值

如何将RGB值转换为十六进制字符串iOS swift

将十六进制字符串转换为 IP 地址

如何将字符串颜色转换为其十六进制代码或 RGB 值?

如何阻止 grafana 将十六进制字符串转换为整数?