将base64字符串转换为十六进制到可读字符串:Swift

将base64字符串转换为十六进制到可读字符串:Swift,swift,string,base64,hex,Swift,String,Base64,Hex,我正在处理一些第三方数据。他们从我们的请求返回的数据假定是base64编码为字符串。它们提供了将其转换为可读格式的说明: *首先,使用开源的tomeko在线工具将Base64字符串转换为十六进制 其次,在SAE J2735标准中,所有消息都作为消息帧发送。MessageFrame包含有关MessageFrame中包含的特定消息类型的信息。解码步骤1中的十六进制数的正确方法是在开源Marben在线解码器工具中的ASN.1消息下选择MessageFrame:。 * 我正在开发一款iPhone应用程序

我正在处理一些第三方数据。他们从我们的请求返回的数据假定是base64编码为字符串。它们提供了将其转换为可读格式的说明:

*首先,使用开源的tomeko在线工具将Base64字符串转换为十六进制

其次,在SAE J2735标准中,所有消息都作为消息帧发送。MessageFrame包含有关MessageFrame中包含的特定消息类型的信息。解码步骤1中的十六进制数的正确方法是在开源Marben在线解码器工具中的ASN.1消息下选择MessageFrame:。 *

我正在开发一款iPhone应用程序,因此接触这些网站进行转换并非最佳选择。我用以下代码将B64字符串解码为十六进制:

func convert64EncodedToHex(_ data:Data) -> String {
    return data.map{ String(format: "%02x", $0) }.joined()
}
结果是这样的:

5B224142 4E464141 41414F51 6F414141 63414545 4E427055 476C5141 45434B67 796C6A4C 49414442 44515A2B 686E3641 4341686F 4D77517A 42414251 51304753 675A4B41 41774961 44536F4E 4B674163 454E426D 43475949 41514347 677A7544 4F34225D 
但当我将其插入Marben解码器时,它失败了:

<error>
  <description>Unexpected end of stream reached when decoding</description>
  <nature>fr.marben.asnsdk.japi.InconsistentStructureException</nature>
  <ErrorOffset>72</ErrorOffset>
  <ValuePath>SPAT.intersections.IntersectionState#1.states.MovementState#1.state-time-speed.MovementEvent#1.regional.SEQUENCE#1.regExtValue</ValuePath>
</error>
最终,我需要在应用程序中将十六进制解码为可读字符串,所以我想知道:

为什么我的b64到十六进制代码似乎失败了 如何将十六进制转换为可读字符串 编辑

好的,在Marben网站上,我选择了错误的下拉列表进行解码。选择MessageFrame提供了一个成功的结果,因此我使用的b64到十六进制正在工作。由此产生的新问题是,我无法解读这些结果:

解码了68字节。 *解码成功*

有几个问题

您提供的十六进制字符串转换为以下原始响应:

[ABNFAAAOQOAAACAEENBPGYLJLIADBDQZ+HN6ACAHOMWQZBABQ0GSGZKAAWIADSONKGACENBYIAAQCGZUDO4]

也许他们是用JSON数组发送给你的?底线是,在你做任何其他事情之前,你需要删掉[and]。例如,如果是JSON,您可以在base64解码之前解析JSON:

do {
    let array = try JSONDecoder().decode([String].self, from: originalJSONData)
    if let base64String = array.first {
         // use `base64String` here
    }
} catch {
    print(error)
}
如果需要与base64字符串关联的数据,可以执行以下操作:

let base64String = "ABNFAAAAOQoAAAcAEENBpUGlQAECKgyljLIADBDQZ+hn6ACAhoMwQzBABQQ0GSgZKAAwIaDSoNKgAcENBmCGYIAQCGgzuDO4"
let payload = Data(base64Encoded: base64String)!
如果您只想将其显示为十六进制字符串,我不知道您为什么要这样做,最简单的方法是:

print(payload as NSData)
这将显示

如果您确实需要该十六进制字符串表示,您可以使用问题中的例程,但在base64解码负载上执行,而不是在base64字符串上:

let payloadString = payload.map { String(format: "%02x", $0) }
    .joined()
print(payloadString)
这将返回:

001345000000390A000000700104341A541A54001022A0CA58CB2000C10D067E867E8008086833043304005043419281928003021A0D2A0D2A001C10D06608660810086833B833B8

就个人而言,如果您想直观地检查二进制有效负载,那么步骤3和4中的十六进制字符串是很有趣的,但是您可能真的需要步骤2中的原始有效负载。当我查看这些数据时,并不清楚这些第三方数据返回了什么,因此我无法对此作进一步评论,但您可能有某种机制来使用这些有效负载