Python, How To Decode Binary Coded Decimal (bcd)
Description of the binary field is: Caller number, expressed with compressed BCD code, and the surplus bits are filled with “0xF” I have tried to print with struct format '1
Solution 1:
BCD codes work with 4 bits per number, and normally encode only the digits 0 - 9. So each byte in your sequence contains 2 numbers, 1 per 4 bits of information.
The following method uses a generator to produce those digits; I am assuming that a 0xF value means there are no more digits to follow:
def bcdDigits(chars):
forcharin chars:
char = ord(char)
for val in (char >> 4, char & 0xF):
if val == 0xF:
returnyield val
Here I use a right-shift operator to move the left-most 4 bits to the right, and a bitwise AND to select just the right-most 4 bits.
Demonstration:
>>>characters = ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff')>>>list(bcdDigits(characters))
[3, 3, 0, 0, 0, 2, 0, 5, 1, 5, 1, 3, 4, 7, 4]
The method works with the c
output; you can skip the ord
call in the method if you pass integers directly (but use the B
unsigned variant instead). Alternatively, you could just read those 16 bytes straight from your file and apply this function to those bytes directly without using struct.
Solution 2:
a = b'\x12\x34\x5f'defcomp3_to_int(a):
b = a.hex()
c = int(b[0:len(b)-1])
if b[len(b)-1:] == 'd':
c = -c
return c
Post a Comment for "Python, How To Decode Binary Coded Decimal (bcd)"