ByteBackpacker 1.2.1

ByteBackpacker 1.2.1

Michael Dorner 维护。



  • Michael Dorner

Swift Build Status codecov codebeat badge CocoaPods CocoaPods DUB Swift Package Manager compatible Average time to resolve an issue Percentage of issues still open

ByteBackpacker

ByteBackpacker 是一个纯 Swift 编写的实用工具,用于将值类型打包到一个 Byte 数组中,然后再反解包。

此外,还有一个 Data(以前称为 NSData扩展,可以将 Data 对象转换为 Byte 数组。

¹ Bytetypealias 的别名为 UInt8

目录

安装

您有三个选择

  1. ByteBackpacker.swift 文件(包含 ByteBackpacker 类)复制到您的项目中。

  2. 使用 Swift 包管理器

     import PackageDescription
    
     let package = Package(
         name: "TestImport",
         dependencies: [
             .Package(url: "https://github.com/michaeldorner/ByteBackpacker.git")
         ]
     )
    
  3. 使用 CocoaPods:`pod 'ByteBackpacker'`

尽管它也可以以相同的方式在 Objective-C 中使用,但我主要是为 Swift 项目考虑的。对于 Objective-C 用户来说,最简单的方式是内嵌 `ByteBackpacker.framework`。当然,Swift 用户也可以这样做,但实际上我没有看到任何优势。

使用方法

正确使用很重要:ByteBackpacker仅支持值类型(例如数字、结构体等),但不支持引用类型(例如类)!有关更多信息,请参阅讨论

所有示例均可在ByteBackpackerPlayground.playground中运行。让我们看看一些一般用途案例

从《Double》到《[Byte]》

let aDouble: Double = 1.0
let aByteArray: [Byte] = ByteBackpacker.pack(aDouble)

从《[Byte]》到《Double》

let option_1: Double = ByteBackpacker.unpack(aByteArray)
let option_2 = ByteBackpacker.unpack(aByteArray) as Double
let option_3 = ByteBackpacker.unpack(aByteArray, toType: Double.self)

从《Double》到《Data》到《[Byte]》到《Double》

var anotherDouble: Double = 2.0
let data = Data(bytes: &anotherDouble, count: MemoryLayout<Double>.size)
var byteArrayFromNSData = data.toByteArray()
let doubleFromByteArray = ByteBackpacker.unpack(byteArrayFromNSData, toType: Double.self)

从《[Byte]》到《Data》

let anotherByteArray: [Byte] = [0, 0, 0, 0, 0, 0, 8, 64]
let dataFromByteArray = Data(bytes: anotherByteArray)

API

Byte 是对 UInt8typealias

ByteOrder是一个代表小端和长端的枚举类型,参见:小端和长端。此外,您还可以要求平台返回系统的本地字节序:ByteOrder.nativeByteOrder。默认情况下,使用.nativeByteOrder进行打包和解包。

将值类型打包到[Byte]中,使用

公开类函数 pack<T: Any>( _ value: T, byteOrder: ByteOrder = .nativeByteOrder) -> [Byte]

将一个[Byte]解包到值类型,可以使用以下方式:

公开类函数 unpack<T: Any>(_ valueByteArray: [Byte], byteOrder: ByteOrder = .nativeByteOrder) -> T

或者如果您想使用类型推断

公开类函数 unpack<T: Any>(_ valueByteArray: [Byte], toType type: T.Type, byteOrder: ByteOrder = .nativeByteOrder) -> T

讨论

泛型

在Swift的泛型中无法指定值类型(参见这里在Stackoverflow上的讨论)。如果能像这样指定方法:func (un)pack<T: Any where T: ~AnyClass>(...),编译器就能检查值类型。目前ByteBackpacker使用assert(...)来确保值类型。

一个未解决的问题是如何测试这个值类型检查的assert(...)

我非常希望改进这个项目。告诉我您的想法,可以在GitHub上,通过电子邮件,或在codereview.stackexchange.com

贡献

待办事项

  • 找到一种解决方案来确保T是一个值类型,而不是一个引用类型
  • 为源代码添加文档以实现良好的Xcode集成
  • 找到测试assert()的解决方案

致谢

在此特别感谢

版本

(不幸/幸运的是) Swift 的开发正在进行中。这使得 ByteBackpacker 需要做出较大的更改。以下表格显示了兼容性。

Swift 版本 2.0 3.0 4.0 及以上
ByteBackpacker 1.0
ByteBackpacker 1.1
ByteBackpacker 1.2 及以上

希望 API 现在已经稳定。

许可协议

ByteBackpacker 以 MIT 许可协议发布。有关更多信息,请参阅 LICENSE 文件。