2012-07-26 289 views
6

說明是:Python中,如何解碼二進制編碼的十進制(BCD)的二進制字段的

主叫號碼,表示對壓縮BCD碼,和剩餘位填充「0xF」

我試圖打印結構格式'16c',我得到:('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff'),如果我使用'16b'我得到(51, 0, 2, 5, 21, 19, 71, 79, -1, -1, -1, -1, -1, -1, -1, -1)。這是不正確的,我應該得到電話號碼,上面的數字是無效的。

print struct.unpack_from('>16b', str(data.read()),offset=46) 

上面是代碼,沒有工作,我得到無效的數字。我應該用什麼格式解壓那個16字節的字段以及如何轉換BCD碼?

回答

11

BCD碼每個數字有4位,並且通常只編碼數字0-9。因此,序列中的每個字節包含2個數字,每4位信息有1個數字。

以下方法使用生成器生成這些數字;我假設一個0xF值意味着沒有更多的數字遵循:

def bcdDigits(chars): 
    for char in chars: 
     char = ord(char) 
     for val in (char >> 4, char & 0xF): 
      if val == 0xF: 
       return 
      yield val 

這裏我用一個right-shift operator到最左邊的4位移動到右邊,和bitwise AND只選擇最右邊的4比特。

演示:

>>> 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] 

的方法的工作原理與c輸出;如果您直接傳遞整數(但使用B無符號變量),則可以跳過方法中的ord調用。或者,您可以直接從文件中讀取這16個字節,並直接將這個函數應用於這些字節,而無需使用struct。

+0

非常感謝。 – Whit3H0rse 2012-07-26 12:30:03

+0

+1非常優雅和pythonic! – Kos 2012-07-26 12:33:13

相關問題