如何在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
相关产品推荐
相关产品推荐

