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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:30:52