7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

整数とバイト配列を相互変換する

Posted at

ストリームから整数を読み込んだり、整数をストリームに書き込んだりするためには、一度バイト型の配列に変換しないと辛い。そして整数型のビット数に応じて適宜ビットシフトするのもまた辛い。

ということで、便利メソッドを再発明してみました。

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) でしか試していません。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?