bc不能完全转换长十六进制数

时间:2015-06-11 13:30:33

标签: shell awk csh bc

我使用bc将长十六进制矢量转换为二进制。它对我的awk脚本中的以下代码示例不起作用:

conversion result: 11111111111111111111111111111111111111111111111111111111111111111111\

我得到以下输出:

{{1}}

这不是完整的结果。 bc不会转换整个字符串,并在其间截断“\”。如何转换整个十六进制数?

2 个答案:

答案 0 :(得分:0)

以下命令使bc在一行中返回1000个字符的二进制字符串。

cmd = "BC_LINE_LENGTH=1000 bc <<< \"ibas ...\"

答案 1 :(得分:0)

这是我从previous answer修改的awk脚本。

#!/usr/bin/awk -f

{
    cnt = split($0, a, FS)
    if( convertArrayBase(16, 2, a, cnt) > -1 ) {

        # use the array here
        for(i=1; i<=cnt; i++) {
            print a[i]
        }
    }
}

    # Destructively updates input array, converting numbers from ibase to obase
    #
    # @ibase:  ibase value for bc
    # @obase:  obase value for bc
    # @a:      a split() type associative array where keys are numeric
    # @cnt:    size of a ( number of fields )
    #
    # @return: -1 if there's a getline error, else cnt
    #
function convertArrayBase(ibase, obase, a, cnt,         i, b, c, cmd) {

    cmd = sprintf("echo \"ibase=%d;obase=%d", ibase, obase)
    for(i=1; i<=cnt; i++ ) {
        cmd = cmd ";" a[i]
    }
    cmd = cmd "\" | bc"

    i = 0 # reset i
    while( (cmd | getline b) > 0 ) {
        # if the return from bc is long, check for "\$" and build up c
        if( b ~ /\\$/ ) {
            sub(/\\/, "", b)
            c = c b
            continue;
        }
        a[++i] = c ? c b : b
        c = ""
    }
    close( cmd )
    return i==cnt ? cnt : -1
}

当脚本被调用awkochmod +x awko时,它可以像:

一样运行
$ echo "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" | ./awko
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

脚本尝试转换记录中所有字段的基础,因此以下内容也有效:

$ echo "A B C D E F" | ./awko
1010
1011
1100
1101
1110
1111

请注意,记录的字段是作为单独的行输出的。可以将输入文件提供给脚本而不是echo。