Cha*_*Raj 4 character-encoding swift swift3
我想String在Swift 3中转换以下十六进制编码:
dcb04a9e103a5cd8b53763051cef09bc66abe029fdebae5e1d417e2ffc2a07a4
Run Code Online (Sandbox Code Playgroud)
它的等价物String:
ܰJ:\ص7cï ¼f«à)ýë®^A~/ü*¤
Run Code Online (Sandbox Code Playgroud)
以下网站的工作非常好:
http://codebeautify.org/hex-string-converter
http://string-functions.com/hex-string.aspx
但我无法在Swift 3中做同样的事情.以下代码也不能完成这项工作:
func convertHexStringToNormalString(hexString:String)->String!{
if let data = hexString.data(using: .utf8){
return String.init(data:data, encoding: .utf8)
}else{ return nil}
}
Run Code Online (Sandbox Code Playgroud)
您的代码没有按照您的想法执行.这一行:
if let data = hexString.data(using:.utf8){
表示"将这些字符编码为UTF-8".这意味着"01"不编码为0x01(1),它编码为0x30 0x31("0""1").那里任何地方都没有"十六进制".
这一行:
return String.init(data:data, encoding: .utf8)
Run Code Online (Sandbox Code Playgroud)
只需获取编码的UTF-8数据,将其解释为UTF-8,然后返回.这两种方法是对称的,所以你应该期望整个函数返回它所传递的任何东西.
马丁和拉尔梅的评论汇集在一起.这似乎是用Latin-1编码的.(这是对这些数据进行编码的一种非常尴尬的方式,但如果它是您正在寻找的,我认为这是编码.)
import Foundation
extension Data {
// From http://stackoverflow.com/a/40278391:
init?(fromHexEncodedString string: String) {
// Convert 0 ... 9, a ... f, A ...F to their decimal value,
// return nil for all other input characters
func decodeNibble(u: UInt16) -> UInt8? {
switch(u) {
case 0x30 ... 0x39:
return UInt8(u - 0x30)
case 0x41 ... 0x46:
return UInt8(u - 0x41 + 10)
case 0x61 ... 0x66:
return UInt8(u - 0x61 + 10)
default:
return nil
}
}
self.init(capacity: string.utf16.count/2)
var even = true
var byte: UInt8 = 0
for c in string.utf16 {
guard let val = decodeNibble(u: c) else { return nil }
if even {
byte = val << 4
} else {
byte += val
self.append(byte)
}
even = !even
}
guard even else { return nil }
}
}
let d = Data(fromHexEncodedString: "dcb04a9e103a5cd8b53763051cef09bc66abe029fdebae5e1d417e2ffc2a07a4")!
let s = String(data: d, encoding: .isoLatin1)
Run Code Online (Sandbox Code Playgroud)
您想要使用十六进制编码的数据作为 AES 密钥,但该数据不是有效的 UTF-8 序列。您可以将其解释为 ISO 拉丁编码中的字符串,但AES(key: String, ...)
初始化程序会将字符串转换回其 UTF-8 表示形式,即您将获得与开始时不同的密钥数据。
因此您根本不应该将其转换为字符串。使用
extension Data {
init?(fromHexEncodedString string: String)
}
Run Code Online (Sandbox Code Playgroud)
Swift 中十六进制/二进制字符串转换的方法,
将十六进制编码的字符串转换为Data,然后将其作为数组传递给AES(key: Array<UInt8>, ...)初始值设定项:
let hexkey = "dcb04a9e103a5cd8b53763051cef09bc66abe029fdebae5e1d417e2ffc2a07a4"
let key = Array(Data(fromHexEncodedString: hexkey)!)
let encrypted = try AES(key: key, ....)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6748 次 |
| 最近记录: |