将base64字符串转换为十六进制到可读字符串:Swift
我正在处理一些第三方数据。他们从我们的请求返回的数据假定是base64编码为字符串。它们提供了将其转换为可读格式的说明: *首先,使用开源的tomeko在线工具将Base64字符串转换为十六进制 其次,在SAE J2735标准中,所有消息都作为消息帧发送。MessageFrame包含有关MessageFrame中包含的特定消息类型的信息。解码步骤1中的十六进制数的正确方法是在开源Marben在线解码器工具中的ASN.1消息下选择MessageFrame:。 * 我正在开发一款iPhone应用程序,因此接触这些网站进行转换并非最佳选择。我用以下代码将B64字符串解码为十六进制:将base64字符串转换为十六进制到可读字符串:Swift,swift,string,base64,hex,Swift,String,Base64,Hex,我正在处理一些第三方数据。他们从我们的请求返回的数据假定是base64编码为字符串。它们提供了将其转换为可读格式的说明: *首先,使用开源的tomeko在线工具将Base64字符串转换为十六进制 其次,在SAE J2735标准中,所有消息都作为消息帧发送。MessageFrame包含有关MessageFrame中包含的特定消息类型的信息。解码步骤1中的十六进制数的正确方法是在开源Marben在线解码器工具中的ASN.1消息下选择MessageFrame:。 * 我正在开发一款iPhone应用程序
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中的原始有效负载。当我查看这些数据时,并不清楚这些第三方数据返回了什么,因此我无法对此作进一步评论,但您可能有某种机制来使用这些有效负载