Swift转Python代码时Base64编码结果不一致问题咨询
问题:Python转Swift的Base64编码结果不一致
我尝试将一段Python代码转换为Swift代码,功能是将JSON字符串编码为Base64,但Swift实现生成的Base64字符串和Python的结果不一致。
Python代码
import datetime import json import base64 payload_nonce = datetime.datetime(2022, 10, 10, 0, 0, 0).timestamp() payload = {"request": "/v1/mytrades", "nonce": payload_nonce} encoded_payload = json.dumps(payload).encode() b64 = base64.b64encode(encoded_payload) print(b64) # 输出:b'eyJyZXF1ZXN0IjogIi92MS9teXRyYWRlcyIsICJub25jZSI6IDE2NjUzMzEyMDAuMH0='
Swift代码
let formatter = DateFormatter() formatter.dateFormat = "dd/MM/yyyy" let date = formatter.date(from: "10/10/2022") let payloadNonce = date!.timeIntervalSince1970 let payload = [ "request": "/v1/mytrades", "nonce": String(describing: payloadNonce) ] do { let json = try JSONSerialization.data(withJSONObject: payload) let b64 = json.base64EncodedString() print(b64) // 输出:eyJyZXF1ZXN0IjoiXC92MVwvbXl0cmFkZXMiLCJub25jZSI6IjE2NjUzMzEyMDAuMCJ9 } catch { // 错误处理 }
问题根源
你的Swift代码和Python代码存在三个核心差异,导致Base64结果不一致:
- 时区未统一:Python中
timestamp()基于UTC计算(或你的本地时区为UTC),但Swift的DateFormatter默认使用本地时区,会导致timeIntervalSince1970的数值偏差。 - Nonce类型错误:Python中nonce是浮点数值类型,JSON序列化后不带引号;Swift里你将其转为字符串,序列化后会被引号包裹,直接改变JSON内容。
- JSON序列化的格式与顺序差异:
- Swift默认转义正斜杠(
/变为\/),Python默认不转义; - Python生成带空格分隔的JSON(如
"key": value),Swift默认生成紧凑无空格格式; - Swift的
Dictionary是无序集合,序列化后的键顺序可能与Python的插入顺序不同,导致JSON内容顺序不一致。
- Swift默认转义正斜杠(
解决方案
修改Swift代码如下,确保和Python的逻辑完全对齐:
let formatter = DateFormatter() formatter.dateFormat = "dd/MM/yyyy" formatter.timeZone = TimeZone(secondsFromGMT: 0) // 强制使用UTC时区,匹配Python时间 guard let date = formatter.date(from: "10/10/2022") else { fatalError("日期解析失败") } let payloadNonce = date.timeIntervalSince1970 // 手动构造与Python格式完全一致的JSON字符串,保证键顺序、格式、类型匹配 let jsonString = "{\"request\": \"/v1/mytrades\", \"nonce\": \(payloadNonce)}" guard let jsonData = jsonString.data(using: .utf8) else { fatalError("字符串转Data失败") } let b64 = jsonData.base64EncodedString() print(b64) // 输出结果与Python一致:eyJyZXF1ZXN0IjogIi92MS9teXRyYWRlcyIsICJub25jZSI6IDE2NjUzMzEyMDAuMH0=
内容的提问来源于stack exchange,提问作者Koh
相关产品推荐
相关产品推荐

