我无法在我的pyodbc输出转换器中解压缩数据

时间:2017-05-19 15:24:33

标签: python converter pyodbc

我不确定如何使用struct.unpack来查看发送的bytearray中的数据,因为数据不是以固定方式进行的。它是一个可变长度的压缩十进制格式,以十六进制字符结尾。数据类型为SQL_DECIMAL。

例如,如果我期待123,我看到bytearray值打印为\ x12 \ x3e ......

我在Win 7上使用Python 3.4.3,pyodbc 4.0.1

1 个答案:

答案 0 :(得分:0)

我不知道这是否符合"解析nybbles"或者是" pythonic"对你来说足够了,但这似乎有效:

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',函数的第一行使用列表推导来提取嵌套列表中的各个数字

[[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(...将它们加起来。