Skip to content

Instantly share code, notes, and snippets.

@heptal
Last active October 20, 2015 12:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save heptal/d8d58f1193bf8e530ca4 to your computer and use it in GitHub Desktop.
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
// 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