0
我不確定如何使用struct.unpack查看發送的bytearray中的數據,因爲數據未以固定的方式進入。它是一個可變長度壓縮十進制格式,以十六進制字符結尾。數據類型是SQL_DECIMAL。我不能在我的pyodbc輸出轉換器中解壓縮數據
例如,如果我期待一個123,我看到打印成\ X12 \ x3e的ByteArray值......
我使用Python 3.4.3,在Win 7 pyodbc 4.0.1
我不確定如何使用struct.unpack查看發送的bytearray中的數據,因爲數據未以固定的方式進入。它是一個可變長度壓縮十進制格式,以十六進制字符結尾。數據類型是SQL_DECIMAL。我不能在我的pyodbc輸出轉換器中解壓縮數據
例如,如果我期待一個123,我看到打印成\ X12 \ x3e的ByteArray值......
我使用Python 3.4.3,在Win 7 pyodbc 4.0.1
我不知道這是否有資格作爲「標準桿[和]的半字節」或者是給你的「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(...
添加它們。
那麼1234是'\ x12 \ x34',12345是'\ x12 \ x34 \ x5e'? –
是的。 1234將是\ x12 \ x34 \ xe0。 順便說一句,我寫代碼來解析nybbles,但我想pythonic的東西。 – ZevGriner