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

如何在Swift中实现Java的二进制字符串转BigInteger及字节数组转换?

将Java BigInteger二进制转字节数组逻辑迁移到Swift

原Java代码

String value = "0001111000010000000100000100100110000000000000101010000101000000011000000010011110011001001101100011101011110110000100001101010111010011101010011001011001100001001000010000000010110001001001001011";
BigInteger bi = new BigInteger(value, 2);
// bi : 11794183182202048648710358761397377436458666044077659329099
byte[] bytes = bi.toByteArray();
// bytes : [B@647aa62

问题分析

你用Int(value, radix: 2)!转换失败,核心原因是这个二进制字符串对应的十进制数值远超过了Swift标准Int的最大范围(64位Int最大值为9223372036854775807),所以转换会返回nil。Swift的Int是固定宽度类型,无法处理Java BigInteger支持的任意精度大数。

实现方案

方案1:使用第三方大数库(推荐)

Swift标准库没有内置的任意精度大数类型,你可以用第三方库比如SwiftBigInt来实现和Java BigInteger一致的逻辑:

import SwiftBigInt

let binaryValue = "0001111000010000000100000100100110000000000000101010000101000000011000000010011110011001001101100011101011110110000100001101010111010011101010011001011001100001001000010000000010110001001001001011"

if let bigInt = BigInteger(binaryValue, radix: 2) {
    let byteArray = bigInt.serialize() // 对应Java的toByteArray()
    print(byteArray)
}

方案2:手动处理二进制字符串(无依赖)

如果不能引入第三方库,可以手动模拟Java toByteArray()的逻辑:去掉前导零后,按8位一组转换为字节,处理补位确保总长度是8的倍数:

let binaryStr = "0001111000010000000100000100100110000000000000101010000101000000011000000010011110011001001101100011101011110110000100001101010111010011101010011001011001100001001000010000000010110001001001001011"

// 去除前导零
let trimmedBinary = binaryStr.trimmingCharacters(in: CharacterSet(charactersIn: "0"))
// 处理全零情况
guard !trimmedBinary.isEmpty else {
    print([UInt8(0)])
    return
}

// 补前导零,让长度是8的倍数
let paddingLength = (8 - trimmedBinary.count % 8) % 8
let paddedBinary = String(repeating: "0", count: paddingLength) + trimmedBinary

// 按8位分组转换为字节
var byteArray = [UInt8]()
for index in stride(from: 0, to: paddedBinary.count, by: 8) {
    let start = paddedBinary.index(paddedBinary.startIndex, offsetBy: index)
    let end = paddedBinary.index(start, offsetBy: 8)
    let byteSegment = String(paddedBinary[start..<end])
    if let byte = UInt8(byteSegment, radix: 2) {
        byteArray.append(byte)
    }
}

print(byteArray)

需要确认的额外信息

  • 是否允许引入第三方库?这会决定你选择哪种方案
  • 待转换的二进制字符串是否可能表示负数?如果是,手动处理时需要额外处理补码逻辑
  • 是否需要严格和Java toByteArray()的输出完全一致(比如字节序、前导零处理细节)?

内容的提问来源于stack exchange,提问作者KimJitae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:10:35