gpt4 book ai didi

swift - 将十六进制编码的字符串转换为字符串

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:18 25 4
gpt4 key购买 nike

我想在 Swift 3 中转换以下十六进制编码的 String:

dcb04a9e103a5cd8b53763051cef09bc66abe029fdebae5e1d417e2ffc2a07a4

与其等价的 String:

Ü°J:\ص7cï  ¼f«à)ýë®^A~/ü*¤

以下网站可以很好地完成这项工作:

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}
}

最佳答案

您的代码并没有按照您的想法行事。这一行:

如果让数据 = hexString.data(使用:.utf8){

表示“将这些字符编码为 UTF-8”。这意味着“01”不编码为 0x01 (1),它编码为 0x30 0x31 (“0”“1”)。那里没有任何“十六进制”。

这一行:

  return String.init(data:data, encoding: .utf8)

只是获取编码的 UTF-8 数据,将其解释为 UTF-8,然后返回它。这两个方法是对称的,因此您应该期望整个函数返回它所传递的任何内容。

将 Martin 和 Larme 的评论集中到一个地方。这似乎是用 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)

关于swift - 将十六进制编码的字符串转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41485494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com