【问题标题】:(Python) Formatting strings for struct.unpack?(Python) struct.unpack 的格式化字符串?
【发布时间】:2014-03-26 20:28:28
【问题描述】:

我有一个值 0-255 的 .csv 文件,用于模拟来自我正在购买的姿态传感器的数据。我正在尝试使用此模拟数据为其编写数据解析器。数据将通过串行端口传输并打包到字节数组中。我已经研究过使用 struct.unpack 来解码数据,这对我来说很有意义,但是我无法正确格式化数据以通过 struct.unpack 运行。这是一个例子:

年份被打包为无符号短整数(2 个十六进制值)。那么“2014”将是('0xde','0x07')。转换为 dec,这给了我 ('222', '7'),这是我的 csv 文件中的内容。问题是,做

hex(222)+hex(7)

给我

'0xde0x7'

但我不能把它放在这里

unpack('H', '0xde0x7')

因为它的格式不正确。应该是

unpack('H', '\xde\x07')

这是我目前不起作用的方法:

dataList = reader(open('testdata.csv', "rb"), delimiter = ",", skipinitialspace=True)
dataList = [[eval(row[0])] for row in dataList]
dataList = [hex(row[0]) for row in dataList]
year = unpack('H', dataList[1]+dataList[2]))

不知何故,我需要用“\”替换所有前导“0”,然后用前导 0 填充任何小于 15(十六进制 F)的数字。有没有一种优雅的方法来做到这一点,还是我想多了是吗?

【问题讨论】:

  • 移位和添加:(7 << 8) + 222 等于 2014
  • @Hyperboreus:更自然(对于 C):(7 << 8) | 222

标签: python csv struct hex


【解决方案1】:

bytearray怎么样:

bytearray([222,7])
Out[15]: bytearray(b'\xde\x07')

struct.unpack('H', bytearray([222,7]))
Out[16]: (2014,)

在您的情况下,来自 csv 阅读器,类似于

row = ['222','7']

struct.unpack('H', bytearray(map(int,row)))
Out[24]: (2014,)

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多