2017-05-19 23 views
0

我不確定如何使用struct.unpack查看發送的bytearray中的數據,因爲數據未以固定的方式進入。它是一個可變長度壓縮十進制格式,以十六進制字符結尾。數據類型是SQL_DECIMAL。我不能在我的pyodbc輸出轉換器中解壓縮數據

例如,如果我期待一個123,我看到打印成\ X12 \ x3e的ByteArray值......

我使用Python 3.4.3,在Win 7 pyodbc 4.0.1

+0

那麼1234是'\ x12 \ x34',12345是'\ x12 \ x34 \ x5e'? –

+0

是的。 1234將是\ x12 \ x34 \ xe0。 順便說一句,我寫代碼來解析nybbles,但我想pythonic的東西。 – ZevGriner

回答

0

我不知道這是否有資格作爲「標準桿[和]的半字節」或者是給你的「Python的」足夠了,但是這似乎工作:

import itertools 


def convert_packed_decimal(byte_stream): 
    digit_list = list(itertools.chain.from_iterable([[(b & 0xF0) >> 4, b & 0xF] for b in byte_stream])) 
    num_digits = digit_list.index(0xE) 
    return sum([digit_list[i] * 10 ** (num_digits - i - 1) for i in range(num_digits)]) 


if __name__ == '__main__': 
    print(convert_packed_decimal(b'\x12\x34\xe0')) 
    print(convert_packed_decimal(b'\x90\x21\x0e')) 

測試數據b'\x12\x34\xe0',該函數的第一行使用列表理解e在XTRACT嵌套列表

[[1,2],[3,4],[14,0]] 

個別數字,然後list(itertools.chain.from_iterable(...變平出來成一個簡單的列表。

[1,2,3,4,14,0] 

第二行找到0xE(十進制14)終止子的索引,給我們的數字來處理的數目(圖4,在這種情況下)。

第三行使用列表解析處理每個數字,以10對應於在列表中的位置的功率相乘,

[1 * 1000, 2 * 100, 3 * 10, 4 * 1] 

然後sum(...添加它們。