【问题标题】:How to append the first zero's of HEX to the BIN string?如何将 HEX 的第一个零附加到 BIN 字符串?
【发布时间】: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


    【解决方案1】:

    每 2 个十六进制字符需要 8 个二进制字符。

    这是一个简单的计算,你可以让 python 为你做填充。

    inputHEX = str(cell.value)
    res = "{value:0{width}b}".format(value=int(inputHEX, 16), width=len(inputHEX) * 4)
    sheet.cell(row=cell.row, column=6).value = res 
    

    除此之外,如果您提出简单的问题,例如“将十六进制转换为二进制时如何保持前导零”或类似的问题,我认为您会得到更多答案。 Excel 的布局、这是 CAN 数据等事实并不重要。

    【讨论】:

    • 谢谢你的回复,我这里还是初学者。因此,我试图融入我认为重要的信息。我会在以后提出问题时接受反馈。
    • 我尝试使用您的实施建议,但出现内存错误。当我在单个inputHex ="0000000001940400" 上尝试它时,结果res=0000000000000000000000000000000000000001100101000000010000000000 不正确,因为开头的零太多(它应该是 31 个零,但有 39 个零)。你知道这背后的原因吗?
    • 为什么是 31 个零?有 9 个零半字节,组成 9*4 = 36 个零加上 1 = 0001 的二进制表示的 3 个零。组成 39 个零。
    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2013-04-05
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多