def _read_month(self): return bcd_to_int(self._read(self._REG_MONTH))
def _read_year(self): return bcd_to_int(self._read(self._REG_YEAR))
def _read_day(self): return bcd_to_int(self._read(self._REG_DAY))
def _read_date(self): return bcd_to_int(self._read(self._REG_DATE))
def _read_minutes(self): return bcd_to_int(self._read(self._REG_MINUTES))
def _read_hours(self): d = self._read(self._REG_HOURS) if (d == 0x64): d = 0x40 return bcd_to_int(d & 0x3F)
def _read_seconds(self): return bcd_to_int(self._read(self._REG_SECONDS))
def hex_to_data(hex_data, encode, decode): """ Converte dados codificados em hexadecimal para o formato original. Parâmetros ---------- hex_data : str string hexadecimal, cujo conteúdo original se pretende recuperar encode : str string que especifica a codificação utilizada decode : str string que especifica o tipo de dados original Retorna ------- content : str/int conteúdo de 'hex_data', convertido para o seu formato original Levanta ------- Exception se formato de categorias está incorreto """ # Codificação BCD if encode and encode.upper() == 'BCD': if decode and decode.upper() == 'INT': content = bcd.bcd_to_int(hex_to_bin(hex_data)) else: content = str(bcd.bcd_to_int(hex_to_bin(hex_data))) # Sem codificação elif encode and encode.upper() == 'NO_ENCODE': if decode and decode.upper() == 'INT': content = int(hex_data) else: content = hex_data # Codificação das categorias elif encode and encode.upper() == 'CATEGORIES_ENCODE': try: # C1;20000315;20100314;S01;<=;38303030 hex_fields = hex_data.split(';'.encode('latin-1').hex()) content = bytes.fromhex(hex_fields[0]).decode('latin-1') + ';' +\ hex_fields[1] + ';' +\ hex_fields[2] + ';' +\ bytes.fromhex(hex_fields[3]).decode('latin-1') + ';' +\ bytes.fromhex(hex_fields[4]).decode('latin-1') + ';' +\ hex_fields[5] except: print('ERROR: Wrong categories format.') sys.exit(1) # Codificação dos data groups e respetivas tags elif encode and encode.upper() == 'DG_TAGS_ENCODE': content = {} try: hex_data = hex_data.upper() while hex_data: # Extrai data group dg_hex = hex_data[:2] dg = hex_to_int(dg_hex) if dg_hex in DG_TAGS: hex_data = hex_data[2:] # Extrai tag do data group if hex_data[:2] == DG_TAGS[dg_hex]: content[dg] = DG_TAGS[dg_hex] hex_data = hex_data[2:] else: print('ERROR: Wrong tag detected.') sys.exit(1) else: print('ERROR: Wrong data group detected.') sys.exit(1) except: print('ERROR: Wrong data group or tags format.') sys.exit(1) # Codificação dos data groups e respetivas tags (EF.COM) elif encode and encode.upper() == 'DG_TAGS_LIST_ENCODE': content = [] all_tags = list(DG_TAGS.values()) try: hex_data = hex_data.upper() i = 0 for j in range(2, len(hex_data) + 1, 2): tag = hex_data[i:j] if not tag in all_tags: print('ERROR: Wrong tag detected.') sys.exit(1) content.append(tag) i = j except: print('ERROR: Wrong data group or tags format.') sys.exit(1) # Codificação dos Biometric Data Block elif encode and encode.upper() == 'BDB_ENCODE': try: content = bytes.fromhex(hex_data) except: print('ERROR: Wrong BDB format.') sys.exit(1) # Codificação da versão para o EF.COM elif encode and encode.upper() == 'VERSION_ENCODE': try: content = '' content += f"{hex_to_int(hex_data[:2]):02d}" content += f"{hex_to_int(hex_data[2:]):02d}" except: print('ERROR: Wrong version format.') sys.exit(1) # Codificação por defeito else: if decode and decode.upper() == 'INT': content = hex_to_int(hex_data) else: content = bytes.fromhex(hex_data).decode() return content