         guard attributeOpcodeByte == ATTReadBlobResponse.attributeOpcode.rawValue
             else { return nil }
         
-        if data.count > ATTReadBlobResponse.length {
-            
-            self.partAttributeValue = Data(data.suffix(from: 1))
-            
-        } else {
-            
-            self.partAttributeValue = Data()
-        }
+        self.partAttributeValue = data.suffixCheckingBounds(from: 1)
     }
     
     public var data: Data {
         
-        return Data([ATTReadBlobResponse.attributeOpcode.rawValue]) + partAttributeValue
+        return Data(self)
     }
 }
+
+// MARK: - DataConvertible
+
+extension ATTReadBlobResponse: DataConvertible {
+    
+    var dataLength: Int {
+        
+        return 1 + partAttributeValue.count
+    }
+    
+    static func += (data: inout Data, value: ATTReadBlobResponse) {
+        
+        data += attributeOpcode.rawValue
+        data += value.partAttributeValue
+    }
+}

/// and contains part of the value of the attribute that has been read.
public struct ATTReadBlobResponse: ATTProtocolDataUnit, Equatable {
    
    public static let attributeOpcode = ATT.Opcode.readBlobResponse
    
    /// Minimum length
    internal static let length = 1 + 0
    
    /// Part of the value of the attribute with the handle given.
    ///

        
        self.partAttributeValue = partAttributeValue
    }
}

public extension ATTReadBlobResponse {
    
    public init?(data: Data) {
        
        guard data.count >= 1
            else { return nil }
        
        let attributeOpcodeByte = data[0]
