Last active
May 10, 2019 06:07
-
-
Save robertmryan/dc24383bf214aa43bd491e84bebbd0e4 to your computer and use it in GitHub Desktop.
This file contains 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
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