extension FileHandle {
    func readUInt32() -> UInt32? {
        let data = self.readData(ofLength: 4)
        guard data.count == 4 else { return nil }
        return UInt32(bigEndian: data.withUnsafeBytes { $0.pointee })
    }
}
Reading from a FileHandle returns a Data value. 
data.withUnsafeBytes calls the closure with a pointer to the
bytes, here the type of the pointer $0 is inferred from the context
as UnsafePointer<UInt32>. 
UInt32(bigEndian:) creates an integer from its big-endian
representation, as an alternative to CFSwapInt32BigToHost().
For more examples on how to convert from/to Data, see for example
round trip Swift number types to/from Data.