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(_:_:_:_:_:)
的NULL
return(详见swift-corelibs-foundation/Foundation/NSString.swift)有关,一个相当不确定的return case,"或者NULL
if创建对象时出现问题。”。我不知道什么会产生“创建对象的问题” :)【参考方案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 将字符串值转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章