【问题标题】:Convert Hex to Binary on large file在大文件上将十六进制转换为二进制
【发布时间】:2014-12-05 17:13:35
【问题描述】:

我有一个大约 230 万行的文本文件。每行包含一个 64 个字符的十六进制字符串。我正在尝试逐行读取文件并将十六进制字符串转换为二进制并输出到文件。我在下面用 bash 编写了这个简单的循环,但我知道它不是最优的,它需要很长时间才能完成。

有没有更快的方法,例如使用 awk?最好使用perl?我只需要更快的东西。

cat /tmp/hexFile.log | while read line
do
bin=$(echo "obase=2; ibase=16; $line" | bc )
bin=`echo $bin | sed 's/\\\ //g'`
echo $bin >> /tmp/binOutput.log
done

【问题讨论】:

  • 只需谷歌“使用 awk 将十六进制转换为二进制”并选择一个解决方案。
  • 艾德你非常有帮助。

标签: bash awk binary hex data-conversion


【解决方案1】:

这对我有用。

#!/usr/bin/perl
while (<>) {
    chomp;
    for (my $i = 0; $i < length($_); $i += 1) {
        printf('%04b', hex(substr($_, $i, 1)))
    }
    print "\n";
}

【讨论】:

    【解决方案2】:

    最快的方法是用C来做

    尽管如此,我还是有一种奇怪的冲动,想用 bash 的原生字符串替换来做这件事……这看起来像是一种精神错乱,但它会起作用……抱歉,我无法抗拒向你展示: -) 你对 C 版本感兴趣吗?

    #!/bin/bash
    
    while read LINE
    do
            LINE={LINE//0/zzzz}
            LINE={LINE//1/zzzy}
            LINE={LINE//2/zzyz}
            LINE={LINE//3/zzyy}
            LINE={LINE//4/zyzz}
            LINE={LINE//5/zyzy}
            LINE={LINE//6/zyyz}
            LINE={LINE//7/zyyy}
            LINE={LINE//8/yzzz}
            LINE={LINE//9/yzzy}
            LINE={LINE//a/yzyz}
            LINE={LINE//b/yzyy}
            LINE={LINE//c/yyzz}
            LINE={LINE//d/yyzy}
            LINE={LINE//e/yyyz}
            LINE={LINE//f/yyyy}
            LINE={LINE//y/1}
            LINE={LINE//z/0}
            echo "$LINE"
    done < yourhexfile  >yourbinaryfile
    

    【讨论】:

    • 这也可以用 sed 以同样的方式完成,也许更快?
    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2016-08-28
    • 2013-07-25
    相关资源
    最近更新 更多