鱼C论坛

 找回密码
 立即注册
查看: 123|回复: 9

[已解决]请问python如何将一个HEX文件转换成对应的二进制01010

[复制链接]
发表于 2024-10-5 15:47:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
数据如下:

@00000000
00 30 2F 1E 4A 78 9A 05 83 A6 8E 99 FF 44 26 96
B6 80 76 30 2F 1E 4A 78 9A 05 83 A6 8E 99 FF 44
CC BD 7C 30 2F FF FE 1E 4A 78 9A 05 83 A6 8E 99
00 30 2F 1E 4A 78 9A 05 83 A6 8E 99 FF 44
@0000003E
FF 49 46 00 5E B5
@00000044
4A 46 87 98 B5 b8 C5 D8




00 30 2F 1E 转换成连续32位: 00000000001100000010111100011110
还有一些数据地址标记@0000003E直接丢弃不参与转换

最佳答案
2024-10-5 17:23:22
novosense 发表于 2024-10-05 17:23
目前数据输出全零,可以帮看看吗?


抱歉,让您遇到问题了。我们来检查并修复代码,用一个完整的例子来实现。以下是改进后的代码示例:
def hex_to_bin(file_path, output_path, total_bytes, bytes_per_group):
    with open(file_path, 'r') as file:
        lines = file.readlines()

    binary_data = []
    total_processed_bytes = 0

    for line in lines:
        line = line.strip()
        if not line or line.startswith('@'):
            continue

        hex_values = line.split()
        for i in range(0, len(hex_values), bytes_per_group):
            if total_processed_bytes >= total_bytes:
                break

            group = hex_values[i:i + bytes_per_group]

            # 如果不足字节数,补零
            while len(group) < bytes_per_group:
                group.append('00')

            # 倒序转换成二进制后追加
            bin_group = ''.join(f'{int(b, 16):08b}' for b in reversed(group))
            binary_data.append(bin_group)

            total_processed_bytes += bytes_per_group

    # 如果总数据不足,额外补零
    while total_processed_bytes < total_bytes:
        binary_data.append('0' * 8 * bytes_per_group)
        total_processed_bytes += bytes_per_group

    with open(output_path, 'w') as output_file:
        for bin_group in binary_data:
            output_file.write(bin_group + '\n')

# 示例用法:从 input.hex 文件读取,输出到 output.bin,并指定总字节量和每组字节数
hex_to_bin('input.hex', 'output.bin', total_bytes=64, bytes_per_group=4)

请确认 `input.hex` 文件中没有意外的字符或行(如额外的空行),每行以 `@` 开头的地址标记就会被忽略。同时,请确保 `total_bytes` 是 `bytes_per_group` 的整数倍,以便正确处理补零逻辑。如果以上逻辑有问题,请根据您的具体需求进行适当调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-5 15:53:55 | 显示全部楼层
要将HEX文件转换成二进制格式,我们可以编写一个Python脚本来处理。以下是一个示例代码,来完成这个转换:
def hex_to_bin(hex_string):
    # 去掉hex_string中的空格
    hex_string = hex_string.replace(' ', '')
    # 将16进制字符串转换为整数,再转换为二进制字符串,并去掉'0b'前缀
    bin_string = bin(int(hex_string, 16))[2:]
    # 保证二进制字符串是32位,不足的用0填充
    bin_string = bin_string.zfill(len(hex_string) * 4)
    return bin_string

def process_hex_file(file_content):
    binary_lines = []
    lines = file_content.strip().split('\n')
    
    for line in lines:
        # 丢弃以@开头的地址标记行
        if line.startswith('@'):
            continue

        # 将数据行的每一组字节都转换成二进制
        hex_values = line.strip().split()
        
        for i in range(0, len(hex_values), 4):
            hex_string = ''.join(hex_values[i:i+4])
            binary_string = hex_to_bin(hex_string)
            binary_lines.append(binary_string)

    return binary_lines

# 示例HEX文件内容
hex_file_content = """
@00000000
00 30 2F 1E 4A 78 9A 05 83 A6 8E 99 FF 44 26 96
B6 80 76 30 2F 1E 4A 78 9A 05 83 A6 8E 99 FF 44
CC BD 7C 30 2F FF FE 1E 4A 78 9A 05 83 A6 8E 99
00 30 2F 1E 4A 78 9A 05 83 A6 8E 99 FF 44
@0000003E
FF 49 46 00 5E B5
@00000044
4A 46 87 98 B5 b8 C5 D8
"""

binary_data = process_hex_file(hex_file_content)

# 打印结果
for binary_line in binary_data:
    print(binary_line)

这个Python脚本首先定义了一个函数`hex_to_bin`来将每一组HEX格式的数据转换成二进制。然后它读取整个文件内容,去掉每一行开头的地址标记,再逐组(4字节)转换成二进制格式,确保每段都是32位。最后,它输出转换后的二进制表示。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-5 16:51:57 | 显示全部楼层
多谢,看起来没问题
方便帮做成文件输入,可以参数化总数居长度,输出到文件中吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-5 17:04:37 | 显示全部楼层
novosense 发表于 2024-10-05 16:51
多谢,看起来没问题
方便帮做成文件输入,可以参数化 ...


当然可以!我们可以修改代码来从文件读入HEX数据,并允许指定每组转换的字节数,然后将结果输出到一个二进制文件中。下面是一个改进版本的示例:
def hex_to_bin(hex_string):
    # 去掉hex_string中的空格
    hex_string = hex_string.replace(' ', '')
    # 将16进制字符串转换为整数,再转换为二进制字符串,不足的用0填充
    bin_string = bin(int(hex_string, 16))[2:].zfill(len(hex_string) * 4)
    return bin_string

def process_hex_file(input_filename, output_filename, group_size):
    binary_lines = []
    with open(input_filename, 'r') as file:
        lines = file.readlines()

    for line in lines:
        # 丢弃以@开头的地址标记行
        if line.startswith('@'):
            continue

        # 将数据行的每一组字节都转换成二进制
        hex_values = line.strip().split()

        for i in range(0, len(hex_values), group_size):
            # 选取指定大小的组
            hex_string = ''.join(hex_values[i:i + group_size])
            binary_string = hex_to_bin(hex_string)
            binary_lines.append(binary_string)

    with open(output_filename, 'w') as output_file:
        for binary_line in binary_lines:
            output_file.write(binary_line + '\n')

# 使用示例,将HEX数据转换为二进制
input_hex_file = 'input.hex'
output_bin_file = 'output.bin'
group_size = 4  # 每组4字节(可以根据需求设置)

process_hex_file(input_hex_file, output_bin_file, group_size)

1. 将上述代码保存到一个Python脚本文件中,例如`convert_hex_to_bin.py`。

2. 创建一个输入HEX格式的文件,例如`input.hex`,并将你的HEX数据粘贴进去。

3. 运行Python脚本,它会将转换后的二进制数据保存到`output.bin`文件中。

通过调整`group_size`变量,你可以控制每次转换的字节数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-5 17:15:42 | 显示全部楼层
Wonderful!
还有两点请求:
1. 请问可以添加一个总数据量的参数吗?如果HEX文件数量不够,剩余的数据补0
2. 目前的数据输出每行32bits没问题,能否把数据按byte倒一下顺序吗?
比如 12 34 56 78
目前输出是
00010010001101000101011001111000
期望输出是:
78 56 34 12
即:
01111000010101100011010000010010
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-5 17:15:58 | 显示全部楼层
novosense 发表于 2024-10-05 17:15
Wonderful!
还有两点请求:
1. 请问可以添加一个总 ...


当然可以!我们可以增加一个参数来指定总数据量,并在数据不足时进行补零。同时,调整输出顺序以符合您的要求。以下是修改后的代码示例:
def hex_to_bin(hex_string, total_bytes, bytes_per_group):
    # 去掉hex_string中的空格和换行,以及地址标记
    hex_string = hex_string.replace(' ', '').replace('\n', '')
    hex_string = ''.join(line for line in hex_string.split('@') if not line.startswith('0000'))

    # 计算总数据长度
    num_bytes = len(hex_string) // 2
    if num_bytes < total_bytes:
        hex_string += '00' * (total_bytes - num_bytes)  # 补零

    # 从数据中提取每个字节,并转换成二进制字符串
    bin_data = []
    for i in range(0, len(hex_string), 2):
        byte_value = hex_string[i:i + 2]
        # 这里使用int转换为二进制并填充到8位
        bin_str = format(int(byte_value, 16), '08b')
        bin_data.append(bin_str)

    # 按指定字节数分组并进行翻转
    result = []
    for i in range(0, len(bin_data), bytes_per_group):
        group = bin_data[i:i + bytes_per_group]
        group.reverse()  # 翻转字节顺序
        result.extend(group)

    return result


def write_bin_file(output_filename, bin_data):
    # 将二进制数据写入文件,每32位一行
    with open(output_filename, 'w') as file:
        for i in range(0, len(bin_data), 4):
            file.write(''.join(bin_data[i:i + 4]) + '\n')


if __name__ == "__main__":
    hex_filename = 'input.hex'
    output_filename = 'output.bin'
    total_bytes = 64  # 根据需要调整总数据量(例如64字节)
    bytes_per_group = 4  # 每组翻转的字节数(例如4字节)

    # 从文件中读取HEX数据
    with open(hex_filename, 'r') as file:
        hex_data = file.read()

    # 转换并写入输出文件
    bin_data = hex_to_bin(hex_data, total_bytes, bytes_per_group)
    write_bin_file(output_filename, bin_data)

这个脚本会从`input.hex`中读取HEX数据,进行翻转和补零处理,并将结果写入`output.bin`。你可以根据你的实际数据和需要调整`total_bytes`和`bytes_per_group`。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-5 17:23:11 | 显示全部楼层
目前数据输出全零,可以帮看看吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-5 17:23:22 | 显示全部楼层    本楼为最佳答案   
novosense 发表于 2024-10-05 17:23
目前数据输出全零,可以帮看看吗?


抱歉,让您遇到问题了。我们来检查并修复代码,用一个完整的例子来实现。以下是改进后的代码示例:
def hex_to_bin(file_path, output_path, total_bytes, bytes_per_group):
    with open(file_path, 'r') as file:
        lines = file.readlines()

    binary_data = []
    total_processed_bytes = 0

    for line in lines:
        line = line.strip()
        if not line or line.startswith('@'):
            continue

        hex_values = line.split()
        for i in range(0, len(hex_values), bytes_per_group):
            if total_processed_bytes >= total_bytes:
                break

            group = hex_values[i:i + bytes_per_group]

            # 如果不足字节数,补零
            while len(group) < bytes_per_group:
                group.append('00')

            # 倒序转换成二进制后追加
            bin_group = ''.join(f'{int(b, 16):08b}' for b in reversed(group))
            binary_data.append(bin_group)

            total_processed_bytes += bytes_per_group

    # 如果总数据不足,额外补零
    while total_processed_bytes < total_bytes:
        binary_data.append('0' * 8 * bytes_per_group)
        total_processed_bytes += bytes_per_group

    with open(output_path, 'w') as output_file:
        for bin_group in binary_data:
            output_file.write(bin_group + '\n')

# 示例用法:从 input.hex 文件读取,输出到 output.bin,并指定总字节量和每组字节数
hex_to_bin('input.hex', 'output.bin', total_bytes=64, bytes_per_group=4)

请确认 `input.hex` 文件中没有意外的字符或行(如额外的空行),每行以 `@` 开头的地址标记就会被忽略。同时,请确保 `total_bytes` 是 `bytes_per_group` 的整数倍,以便正确处理补零逻辑。如果以上逻辑有问题,请根据您的具体需求进行适当调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-5 18:27:00 | 显示全部楼层
这次没问题了,推荐给芯片的网友产生memory文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-5 18:27:07 | 显示全部楼层
novosense 发表于 2024-10-05 18:27
这次没问题了,推荐给芯片的网友产生memory文 ...


太好了,很高兴这个解决方案对您有帮助!能为您提供帮助我感到很开心。如果您有其他问题或需要进一步的帮助,随时可以问我。祝您和朋友们的项目一切顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 06:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表