ストリームから整数を読み込んだり、整数をストリームに書き込んだりするためには、一度バイト型の配列に変換しないと辛い。そして整数型のビット数に応じて適宜ビットシフトするのもまた辛い。
ということで、便利メソッドを再発明してみました。
import Foundation
extension UInt32 { // UInt16、UInt64、Intなどにも適用できると思います...
init?(bytes: [UInt8]) {
guard let value: UInt32 = convertBytesToValue(bytes: bytes) else {
return nil
}
self = value
}
func bytes() -> [UInt8] {
return convertValueToBytes(value: self)
}
}
fileprivate func convertBytesToValue<T>(bytes: [UInt8]) -> T? {
if bytes.count < MemoryLayout<T>.size {
return nil
}
let value = UnsafePointer(bytes).withMemoryRebound(to: T.self, capacity: 1) {
$0.pointee
}
return value
}
fileprivate func convertValueToBytes<T>(value: T) -> [UInt8] {
var mutableValue = value
let bytes = Array<UInt8>(withUnsafeBytes(of: &mutableValue) {
$0
})
return bytes
}
このコードをメモリに読み書きするストリームに適用したものを GitHub で公開しました。あまり使い込んでいないので何かしら不具合があるかもしれませんが...
なお Xcode 8.1 (Swift 3.0.1) でしか試していません。