HEX数组的字符串表示形式

时间:2016-11-18 03:40:17

标签: python

我需要一些帮助,我有一个解析串行数据的python脚本,数据存储在一个字节数组上。

问题是,我有一个数组,其中包含日期时间的字符串表示形式:

bytearray['\x01','\x35','\x40','\x02','\x21','\x016']

表示该数组代表01/35:40 02/21/2016

如何将此数组解析为日期时间 我的意思是我可以毫无问题地做到这一点

datetime.strptime('01:35:40 02/21/16', %H:%M:S %m/%d/%y)

但是我不能从那个十六进制数组中得到怪异的str表示

请帮忙! 谢谢!

1 个答案:

答案 0 :(得分:1)

也许它看起来像字符串,但bytearray()保存数字(字节),你会看到它们的十六进制代码。

看起来像BCDBinary-Coded Decimals),您可以使用位操作轻松转换为整数

import datetime

b = bytearray('\x01\x35\x40\x02\x21\x16')

# decode BCD numbers    
n = [(x>>4)*10 + (x&15) for x in b]

# add 2000 to year
n[5] += 2000

# create datetime object
#d = datetime.datetime(year=n[5], month=n[3], day=n[4], hour=n[0], minute=n[1], second=n[2])
d = datetime.datetime(n[5], n[3], n[4], n[0], n[1], n[2])

# print it
print(d.strftime('%H:%M:%S %m/%d/%y'))

顺便说一句:如果您没有Python bytearray()而是普通列表,那么您可以使用ord()

b = ['\x01', '\x35', '\x40', '\x02', '\x21', '\x16']
b = [ord(x) for x in b]

# decode BCD numbers    
n = [(x>>4)*10 + (x&15) for x in b]

# ...