         self.init(bigEndian: BluetoothAddress(bytes: bytes))
     }
     
+    /// Convert a Bluetooth Address to its big endian string representation (e.g. `00:1A:7D:DA:71:13`).
     public var rawValue: String {
         
         let bytes = self.bigEndian.bytes

    /// Initialize a Bluetooth Address from its big endian string representation (e.g. `00:1A:7D:DA:71:13`).
    public init?(rawValue: String) {
        
        // verify string
        guard rawValue.utf8.count == 17
            else { return nil }
        

    /// The maximum representable value in this type.
    public static var max: BluetoothAddress { return BluetoothAddress(bytes: (.max, .max, .max, .max, .max, .max)) }
    
    /// A zero address.
    public static var zero: BluetoothAddress { return .min }
    
    /// Wildcard address.
    internal static var any: BluetoothAddress { return .zero }
    
    /// No address
    internal static var none: BluetoothAddress { return .max }
}

// MARK: - Data

public extension BluetoothAddress {
    
    internal static var length: Int { return 6 }
    
    public init?(data: Data) {
        
        guard data.count == type(of: self).length
            else { return nil }
        
        self.bytes = (data[0], data[1], data[2], data[3], data[4], data[5])
