Python, comment décoder décimale codée Binaire (BCD)
Description du champ binaire est:
Numéro appelant, exprimé comprimé BCD code, et le surplus de bits sont remplis de “0xF”
J'ai essayé d'imprimer avec struct format '16c'
et j'obtiens: ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff')
et si j'utilise '16b'
- je obtenir (51, 0, 2, 5, 21, 19, 71, 79, -1, -1, -1, -1, -1, -1, -1, -1)
. Et il n'est pas correct, je devrais obtenir un numéro de téléphone, et les chiffres ci-dessus ne sont pas valides.
print struct.unpack_from('>16b', str(data.read()),offset=46)
Ci-dessus est le code qui ne fonctionne pas et j'ai des numéros non valides. Avec quel format dois-je déballez que 16 octets du champ et comment convertir BCD code ?
Vous devez vous connecter pour publier un commentaire.
BCD codes fonctionnent avec 4 bits par numéro, et normalement encoder uniquement les chiffres 0 - 9. Donc, chaque octet dans votre séquence contient 2 nombres, de 1 par 4 bits d'information.
La méthode suivante utilise un générateur afin de produire ces chiffres; je suppose qu'un 0xF valeur il n'y a pas plus de chiffres à suivre:
J'utilise ici une décalage vers la droite de l'opérateur pour déplacer le plus à gauche de 4 bits vers la droite, et un au niveau du bit ET pour sélectionner le plus à droite de 4 bits.
Démonstration:
La méthode fonctionne avec la
c
de sortie; vous pouvez ignorer leord
appel de la méthode si vous passer des entiers directement (mais l'utilisation de laB
unsigned variante à la place). Alternativement, vous pouvez simplement lire ces 16 octets directement à partir de votre fichier et d'appliquer cette fonction à ces octets directement, sans l'aide struct.for val in [char >> 4, char & 0xF]:
for
boucle itérateur expression).