如何用Unix命令或Tcl过程将32位十六进制转为每行1位二进制?
32位十六进制转逐行LSB优先二进制的实现方案
下面提供两种实现方式:Unix命令行组合工具方案,以及Tcl脚本过程方案。
Unix命令行方案
可以通过awk、tr、rev和fold工具组合完成需求,执行以下命令即可:
awk '{printf "%032s\n", substr("00000000000000000000000000000000" strtonum("0x"$1), length(strtonum("0x"$1))*4+1)}' input.txt | tr ' ' '0' | rev | fold -w1 > output.txt
各工具作用说明:
awk:将每行十六进制转为十进制,再格式化为32位宽度的二进制字符串(不足位补前导空格)tr ' ' '0':把二进制字符串中的空格替换为0,确保生成完整的32位0/1序列rev:反转二进制字符串,将原数的最低有效位(LSB)移到首位fold -w1:将每个二进制字符拆分为单独一行- 最后通过
>将结果写入目标输出文件
Tcl脚本方案
编写Tcl过程处理文件,逻辑清晰且易于调整:
proc hex_to_lsb_lines {input_file output_file} { set in_fd [open $input_file r] set out_fd [open $output_file w] while {[gets $in_fd hex_line] != -1} { set hex_line [string trim $hex_line] if {$hex_line eq ""} { continue } # 十六进制转十进制,再格式化为32位二进制字符串(MSB在前) set decimal_val [expr {0x$hex_line}] set msb_first_bin [format "%032b" $decimal_val] # 反转字符串得到LSB在前的序列 set lsb_first_bin [string reverse $msb_first_bin] # 逐位写入输出文件 foreach bit [split $lsb_first_bin ""] { puts $out_fd $bit } } close $in_fd close $out_fd } # 调用示例:处理input.txt,输出到output.txt # hex_to_lsb_lines "input.txt" "output.txt"
过程说明:
- 打开输入和输出文件句柄,逐行读取十六进制数据
- 跳过空行,将有效十六进制字符串转为十进制后,格式化为32位二进制
- 反转二进制字符串调整为LSB优先顺序
- 拆分每个二进制位,逐行写入输出文件
内容的提问来源于stack exchange,提问作者renvill
相关产品推荐
相关产品推荐

