BinarySwift 0.9.5

BinarySwift 0.9.5

测试测试
语言语言 SwiftSwift
许可 BSD
发布最后发布2018年2月
SwiftSwift 版本3.1
SPM支持 SPM

Łukasz Kwoska 维护。



  • Łukasz Kwoska

![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20OSX -333333.svg)

BinarySwift

BinarySwift 是一个用于解析二进制数据的纯 Swift 库。它包含两个组件 - 可以用于在不更改环境中的二进制数据解析的 BinaryReader,以及保持最后一个读取字节的索引并以自动更新它的 BinaryDataReader。

使用此库,您可以读取

  • UInt(8/16/32/64)
  • Int(8/16/32/64)
  • Float(32,64)
  • 空终止的 UTF8 字符串
  • 已知大小的 UTF8 字符串

如何使用

BinaryData 有多种初始化器。最显著的是 public init(data: [UInt8], bigEndian: Bool = default)public init(data: NSData, bigEndian: Bool = default)

BinaryData 是一个不可变结构体,因此可以用 let 安全地创建。

使用 BinaryReader 解析 IP 框架头非常简单

struct IPHeader {
  let version: UInt8
  let headerLength: UInt8
  let typeOfService: UInt8
  let length: UInt16
  let id: UInt16
  let offset: UInt16
  let timeToLive: UInt8
  let proto:UInt8
  let checksum: UInt16
  let source: in_addr
  let destination: in_addr
}

let nsData = ...
let data = BinaryData(data: nsData)

let header = IPHeader(version: try data.get(0),
                    headerLength: try data.get(1),
                    typeOfService: try data.get(2),
                    length: try data.get(3),
                    id: try data.get(5),
                    offset: try data.get(7),
                    timeToLive: try data.get(8),
                    proto: try data.get(9),
                    checksum: try data.get(10),
                    source: in_addr(s_addr: try data.get(12)),
                    destination: in_addr(s_addr: try data.get(16)))

如果您没有问题使用可变引用类型,使用 BinaryDataReader 解析则更简单

struct IPHeader {
  let version: UInt8
  let headerLength: UInt8
  let typeOfService: UInt8
  let length: UInt16
  let id: UInt16
  let offset: UInt16
  let timeToLive: UInt8
  let proto:UInt8
  let checksum: UInt16
  let source: in_addr
  let destination: in_addr
}

let nsData = ...
let data = BinaryData(data: nsData)
let reader = BinaryDataReader(data)

let header = IPHeader(version: try reader.read(),
                    headerLength: try reader.read(),
                    typeOfService: try reader.read(),
                    length: try reader.read(),
                    id: try reader.read(),
                    offset: try reader.read(),
                    timeToLive: try reader.read(),
                    proto: try reader.read(),
                    checksum: try reader.read(),
                    source: in_addr(s_addr: try reader.read()),
                    destination: in_addr(s_addr: try reader.read()))

您甚至可以将 reader 传递给其他函数,因为它是一个 class,并且引用语义适用。

这个库是完美的折中方案。既非魔法也非过于冗长。

#贡献Contributions