 	///   - length: number of bytes to read (Le)
 	///   - offset: number of bytes to skip (15-bit unsigned integer, ranging from 0 to 32 767)
 	///   - handler: function to execute after completion
-	func readBytes(length: UInt8, offset: UInt16 = 0, handler: @escaping (ReadResponse) -> Void) {
-		self.transmit(Data(bytes: readBinary + [UInt8(offset >> 8), UInt8(offset & 0xff), length])) { (binaryReply, error) in
+	func readBytes(length: UInt8, offset: UInt16 = 0, handler: @escaping (_ response: ReadResponse) -> Void) {
+		let packet = Data(
+			bytes: [
+				0x00, // Commmand header: CLA (Class byte)
+				0xB0,                  // INS (Instruction byte: READ BINARY)
+				UInt8(offset >> 8),    // P1  (Parameter byte: offset's high byte)
+				UInt8(offset & 0xff),  // P2  (Parameter byte: offset's  low byte)
+				
+				length // Length of the file
+			]
+		)
+		transmit(packet) { (binaryReply, error) in
 			if let error = error {
-				print(error)
+				handler(.error(error))
 			} else if let binaryReply = binaryReply {
 				let statusBytes = (binaryReply[binaryReply.endIndex-2], binaryReply.last!)
 				switch statusBytes {

		}
	}
	
	/// Select dedicated file and read all its bytes. This is a helper function that combines the SELECT (section 7.1.1) & READ BINARY (section 7.2.3) commands from ISO 7816-4.
	///
	/// - Parameters:
	///   - file: Absolute path to dedicated file without the MF Identifier
	///   - updateProgress: function that gets called while reading the large files and informs the progress of the read command
	///   - reply: function that gets called when the file is read
	func read(file: [UInt8], updateProgress: ((UInt8)->Void)? = nil, reply: @escaping (ReadResponse)->Void) {
		select(dedicatedFile: file) {
			if let error = $0 {
				reply(.error(error) )

		self.dateStyle = style
	}
}
