在大文件上将十六进制转换为二进制

时间:2014-10-10 13:48:58

标签: bash awk binary hex data-conversion

我有一个大约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

2 个答案:

答案 0 :(得分:0)

这适合我。

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

答案 1 :(得分:0)

最快的方法是在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