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

