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

bc does not completely convert long hexadecimal numbers

我正在使用 bc 将长十六进制向量转换为二进制。它不适用于我的 awk 脚本中的以下代码示例:

#!/bin/awk -f

cmd = "bc <<< \"ibase=16;obase=2;"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\""

result = ((cmd | getline binary_vector) > 0 ? binary_vector : -1)
close(cmd)
print "conversion result: " result

我得到以下输出:

conversion result: 11111111111111111111111111111111111111111111111111111111111111111111\

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

以下命令使 bc return 成为一行 1000 个字符的二进制字符串。

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

这是我从 .

修改的 awk 脚本
#!/usr/bin/awk -f

{
    cnt = split([=10=], 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。