【发布时间】:2020-06-02 01:17:45
【问题描述】:
我正在尝试在 Excel 中实现 CAN 总线数据的位提取器。我在算法部分苦苦挣扎,因此这主要独立于 Excel/openpyxl。
我有一个表,其中 ID 存储在 B 列中,每个时间步的二进制代码存储在 F 列中。我想解析二进制数并提取包含信号值的部分。一个 ID 可以有一个或多个信号。根据 ID,我想遍历所有行并将二进制转换为十进制(如下所示)。 ID 包含为每个 ID 定义的 3、4、5、6、7 或 8 个字节(以下示例:2E 有 8 个字节,4A 有 5 个字节)。
输入:
A B C D E F G H .. M
.. 2E .... 0000000000000AA4..
...4A ... 02478304B..
有组织的输入: A B C D E F G H .. M .. 2E .... 00 00 00 00 00 00 0A A4.. ...4A ... 00 24 78 30 4B..
电流输出:
A B C D E F G H .. M
..2E .... ... 101010100100
..4A ....... 100100011110000011000001001011
想要的输出:
A B C D E F G H .. M
..2E .... ... 0000000000000000000000000000000000000000000000000000101010100100
..4A ....... 100100011110000011000001001011
问题:
由于在测量开始时,大多数值都设置为零(在 HEX 中,在 E 列中),BIN 不包括它们,因此无法正确提取信号。我不知道如何在 convertHEXtoBIN() 函数中执行此操作(见下文)。
E 列中的 HEX 值是我成功转换为 BIN 的字符串,但开头的零未包含在 BIN 代码中。最后的那些零包括在内。
方法:
在下面的函数中,我将添加一个 if 子句来捕获第一个零,cell.value 包含一个零,直到第一个 HEX code != 0 出现,然后这些零被附加到八倍(如果显示两个零,则为 8 倍零向上,如果出现 1 个零则 4 次)并放在二进制代码 res 之前。另一种解决方案可能是让convertHEXtoBIN() 函数包含零(而不是忽略它们),但我不知道这是否可能......
您知道如何实施吗?
目前的代码:
import openpyxl
from openpyxl import Workbook
theFile = openpyxl.load_workbook('Adapted_T013.xlsx')
allSheetNames = theFile.sheetnames
print("All sheet names {} " .format(theFile.sheetnames))
sheet = theFile.active
def convertHEXtoBIN():
max_row_var = sheet.max_row+1
for row in sheet.iter_rows(min_row=1, max_row=max_row_var,values_only = True):
for cell in sheet["E"]:
if cell.value is not None:
inputHEX = str(cell.value)
res = "{0:08b}".format(int(inputHEX,16))
sheet.cell(row=cell.row, column=6).value = res
break
【问题讨论】:
标签: python algorithm binary openpyxl can-bus