Skip to content

Instantly share code, notes, and snippets.

@robertmryan
Last active May 10, 2019 06:07
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 robertmryan/dc24383bf214aa43bd491e84bebbd0e4 to your computer and use it in GitHub Desktop.
Save robertmryan/dc24383bf214aa43bd491e84bebbd0e4 to your computer and use it in GitHub Desktop.
class WithUnsafeBytesDemo {
func unalignedExample() {
// deliberately throw in extra byte at the start
let originalData = Data([0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04])
print("original base address:", originalData.withUnsafeBytes { $0.baseAddress } ?? "Unknown address")
print("original start index: ", originalData.startIndex) // is 0
print("original binary data: ", originalData as NSData)
print("")
// get the data after that extra byte
let index = originalData.startIndex.advanced(by: 1)
let data = originalData[index...]
print("subdata base address: ", data.withUnsafeBytes { $0.baseAddress } ?? "Unknown address")
print("subdata start index: ", data.startIndex) // is 1
print("subdata binary data: ", data as NSData)
print("result (should be 7): ", extractPacketSizeFromIV(iv: data)!)
}
func alignedExample() {
let data = [Int32(1).bigEndian, Int32(1<<1).bigEndian, Int32(1<<2).bigEndian]
.withUnsafeBytes { Data($0) }
print("aligned binary data: ", data as NSData)
print("result (should be 7): ", extractPacketSizeFromIV(iv: data)!)
print("")
}
func extractPacketSizeFromIV(iv: Data) -> Int32? {
return iv.withUnsafeBytes { rawBuffer -> Int32 in
let buffer = rawBuffer.bindMemory(to: Int32.self)
let r0 = buffer[0].bigEndian
let r1 = buffer[1].bigEndian
let r2 = buffer[2].bigEndian
return r2 ^ r1 ^ r0
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment