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

Swift中Java ByteArrayOutputStream与C# BinaryWriter等效实现咨询

Swift中Java ByteArrayOutputStream与C# BinaryWriter等效实现

1. 自定义等效于Java java.io.ByteArrayOutputStream的实现

Swift原生OutputStream没有内存缓冲区直接访问、获取大小等能力,我们可以自行实现CustomArrayOutputStream,完全对齐Java端的能力:

public class CustomArrayOutputStream {
    // 内部字节缓冲区,对应Java ByteArrayOutputStream的buf属性
    fileprivate var buf: [UInt8] = []
    // 当前写入偏移位置,对应流的Position属性
    public private(set) var position: Int = 0

    /// 写入单个字节,对齐Java ByteArrayOutputStream.write(int)
    public func write(_ byte: UInt8) {
        if position < buf.count {
            buf[position] = byte
        } else {
            buf.append(byte)
        }
        position += 1
    }

    /// 批量写入字节数组,对齐Java ByteArrayOutputStream.write(byte[])
    public func write(_ bytes: [UInt8]) {
        bytes.forEach(write)
    }

    /// 获取完整缓冲区,对应Java getBuffer()
    public func getBuffer() -> [UInt8] {
        return buf
    }

    /// 获取已写入总大小,对应Java size()
    public func size() -> Int {
        return buf.count
    }
}

对应的CustomSerializer实现直接适配即可:

public class CustomSerializer {
    fileprivate var output: CustomArrayOutputStream

    public init(output: CustomArrayOutputStream = CustomArrayOutputStream()) {
        self.output = output
    }

    func custom_bool(value: Bool) {
        output.write(value ? 1 : 0)
    }
}

2. 等效于C# BinaryWriter的实现

在上述CustomArrayOutputStream基础上扩展不同类型的写入方法,即可完全对齐BinaryWriter的能力:

extension CustomArrayOutputStream {
    /// 写入Int32,对应BinaryWriter.Write(Int32)
    public func write(_ value: Int32) {
        var val = value.littleEndian // 可根据业务需求调整大小端规则
        let bytes = withUnsafeBytes(of: &val) { Array($0) }
        write(bytes)
    }

    /// 写入Double,对应BinaryWriter.Write(Double)
    public func write(_ value: Double) {
        var val = value.littleEndian
        let bytes = withUnsafeBytes(of: &val) { Array($0) }
        write(bytes)
    }

    // 可根据需求扩展String、Float、Int64等其他类型的写入方法
}

场景问题解决方案

场景1:缓冲区与大小获取

直接调用对应方法即可,完全符合需求:

var content: [UInt8] = output.getBuffer()
var size: Int = output.size()

场景2:偏移量getOffset()实现

直接返回自定义流的position属性即可:

public func getOffset() -> Int {
    return output.position
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:18:03