Python按位宽规则实现大端hex格式vcon文件转小端格式
.vcon大端十六进制转小端实现方法
核心转换逻辑:大小端转换的本质是反转多字节数据块内的字节顺序,8位(1字节)数据无需调整顺序,16位(2字节)、32位(4字节)、64位(8字节)数据只需将块内字节倒序排列即可。
- 基础换算规则:1字节对应2个十六进制字符,因此单个块对应的十六进制截取长度 = 位宽 / 4(例:16位对应4个字符,32位对应8个字符)
- 预处理环节:读取.vcon文件内的十六进制字符串,删除所有换行、空格等无关字符;校验位宽列表合法性,确保总位宽对应的字符长度和十六进制字符串长度匹配,位宽取值仅支持8、16、32、64
- 逐块转换流程:维护一个初始值为0的读取偏移量,逐个遍历位宽列表中的值:
- 计算当前块需要截取的十六进制字符长度,从偏移量位置截取出当前块的大端子串
- 位宽为8时,直接保留子串内容
- 位宽为16/32/64时,将子串按每2个字符切分为单个字节的十六进制表示,把切分后的字节列表倒序拼接,即为当前块的小端内容
- 将处理后的块内容追加到结果中,偏移量向后移动当前块的字符长度,继续处理下一个块
- 结果输出:将所有块拼接完成的小端十六进制字符串写入新的.vcon文件即可。
转换逻辑匹配示例验证:
输入大端串:F324658951425AF3EB0011
位宽列表:[16, 8, 8, 32, 8, 16]
逐块处理结果:
- 16位块:截取
F324,切为['F3','24']倒序得24F3- 8位块:截取
65,直接保留得65- 8位块:截取
89,直接保留得89- 32位块:截取
51425AF3,切为['51','42','5A','F3']倒序得F35A4251- 8位块:截取
EB,直接保留得EB- 16位块:截取
0011,切为['00','11']倒序得1100
最终拼接结果:24F36589F35A4251EB1100,和预期结果完全一致。
可直接运行的Python实现代码:
def convert_vcon_endian(input_file_path, output_file_path, bit_width_list): # 读取输入文件,去除所有空白字符 with open(input_file_path, 'r', encoding='utf-8') as f: hex_str = ''.join(f.read().split()) # 输入合法性校验 total_bits = sum(bit_width_list) assert total_bits % 8 == 0, "位宽总和必须是8的倍数" total_bytes = total_bits // 8 assert len(hex_str) == total_bytes * 2, "十六进制字符串长度与位宽列表不匹配" for bw in bit_width_list: assert bw in (8, 16, 32, 64), f"不支持的位宽值{bw},仅支持8/16/32/64" offset = 0 result = [] for bw in bit_width_list: char_len = bw // 4 block = hex_str[offset:offset+char_len] if bw == 8: result.append(block) else: # 按单字节切分后倒序拼接 byte_list = [block[i:i+2] for i in range(0, char_len, 2)] little_endian_block = ''.join(reversed(byte_list)) result.append(little_endian_block) offset += char_len # 写入输出文件 final_hex = ''.join(result) with open(output_file_path, 'w', encoding='utf-8') as f: f.write(final_hex) return final_hex # 调用示例 if __name__ == "__main__": # 替换为实际的位宽列表、文件路径即可 bit_width_config = [16, 8, 8, 32, 8, 16] convert_vcon_endian("input.vcon", "output.vcon", bit_width_config)
内容的提问来源于stack exchange,提问作者grace
相关产品推荐
相关产品推荐

