Swift如何打包混合二进制数据 转换Java DataOutputStream代码
能力确认
Swift 原生具备完整的二进制数值序列化能力,无需依赖第三方库即可实现和JavaDataOutputStream完全一致的打包效果。核心依赖基础库提供的Data类型即可完成操作,唯一需要注意的是Java默认采用大端字节序写入多字节数值,Swift实现时需要手动做端序对齐,避免跨端解析错误。
对应Java逻辑的Swift实现
以下代码生成的二进制数据和你提供的Java代码输出完全一致,可直接用于跨端传输:
import Foundation var binaryData = Data() // 写入32位int,对应dos.writeInt(123) let intVal: Int32 = 123 withUnsafeBytes(of: intVal.bigEndian) { binaryData.append(contentsOf: $0) } // 写入8位byte,对应dos.writeByte(123) let byteVal: Int8 = 123 withUnsafeBytes(of: byteVal) { binaryData.append(contentsOf: $0) } // 写入16位short,对应dos.writeShort(123) let shortVal: Int16 = 123 withUnsafeBytes(of: shortVal.bigEndian) { binaryData.append(contentsOf: $0) } // 写入64位double,对应dos.writeDouble(1.23) let doubleVal = 1.23 withUnsafeBytes(of: doubleVal.bitPattern.bigEndian) { binaryData.append(contentsOf: $0) } // 写入32位float,对应dos.writeFloat(1.23f) let floatVal: Float = 1.23 withUnsafeBytes(of: floatVal.bitPattern.bigEndian) { binaryData.append(contentsOf: $0) } // binaryData即为最终打包完成的二进制串,可直接发送 // Send the binaryData somewhere! ->>>
如果需要写入Java定义的long类型(64位整数),追加如下代码即可:
// 写入64位long,对应dos.writeLong(xxx) let longVal: Int64 = 123 withUnsafeBytes(of: longVal.bigEndian) { binaryData.append(contentsOf: $0) }
实现注意事项
- 严格匹配类型长度:不要直接使用Swift默认的
Int类型做序列化,苹果64位设备上Int占8字节,和Java中4字节的int、2字节的short长度不匹配,会导致二进制结构错位。 - 不要遗漏端序转换:所有长度超过1字节的数值类型,都必须先转换为大端表示再写入,否则Java侧解析会得到完全错误的数值。
- 高频使用场景可以给
Data写分类扩展,封装不同类型的写入方法,减少重复的withUnsafeBytes调用。
可选替代方案
如果是纯苹果生态内部的二进制传输,除了手动拼接Data的方案,也可以使用系统自带的Codable协议结合二进制编码器实现序列化,但该方案生成的是苹果生态专属格式,无法和Java侧的DataInputStream直接兼容,跨端场景不适用。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

