You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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序列化的格式与顺序差异:
    1. Swift默认转义正斜杠(/变为\/),Python默认不转义;
    2. Python生成带空格分隔的JSON(如"key": value),Swift默认生成紧凑无空格格式;
    3. Swift的Dictionary是无序集合,序列化后的键顺序可能与Python的插入顺序不同,导致JSON内容顺序不一致。

解决方案

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:50:21