Last active
October 20, 2015 12:57
-
-
Save heptal/d8d58f1193bf8e530ca4 to your computer and use it in GitHub Desktop.
Some convenient Swift extension methods for reading raw or binary data in NSInputStream
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Convenience extension for reading from NSInputStream from swift | |
// Useful for reading binary data in chunks using arbitary structs | |
extension NSInputStream { | |
func readByteArray(len: Int) -> [UInt8] { | |
var readBuffer = Array<UInt8>(count:len, repeatedValue: 0) | |
let numberOfBytesRead = self.read(&readBuffer, maxLength: readBuffer.count) | |
assert(numberOfBytesRead == len) | |
return readBuffer | |
} | |
func readNSData(len: Int) -> NSData { | |
return NSData(bytes: readByteArray(len), length: len) | |
} | |
func readCharsAsString(len: Int) -> String { | |
return String(data: readNSData(len), encoding: NSUTF8StringEncoding)! | |
} | |
func readType<T>(_: T.Type) -> T { | |
let buffer = readByteArray(sizeof(T)) | |
return UnsafePointer<T>(buffer).memory | |
} | |
} | |
// Example | |
struct RGBA { | |
var r,g,b,a: UInt8 | |
} | |
func generateRandomData(count:Int) -> NSData | |
{ | |
var array = Array<UInt8>(count: count, repeatedValue: 0) | |
arc4random_buf(&array, Int(count)) | |
return NSData(bytes: array, length: count) | |
} | |
let randomData = generateRandomData(256) | |
func getRGBAFromBinaryData(data: NSData) -> [RGBA] { | |
var myStructArray: [RGBA] = [] | |
let stream = NSInputStream(data: randomData) | |
stream.open(); defer { stream.close() } // defer closes handle on scope exit | |
while stream.hasBytesAvailable { | |
myStructArray.append(stream.readStruct(RGBA)) | |
} | |
return myStructArray | |
} | |
let structuredData = getRGBAFromBinaryData(randomData) | |
//[{r 127, g 78, b 133, a 51}, {r 79, g 26, b 20, a 189}, {r 25, g 124, b 6, a 130}, {r 252, g 244, b 128, a 227}, ...] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment