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
}
当脚本被调用时 awko
和 chmod +x awko
它可以是 运行 比如:
$ echo "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" | ./awko
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
该脚本尝试转换记录中所有字段的基数,因此以下内容也有效:
$ echo "A B C D E F" | ./awko
1010
1011
1100
1101
1110
1111
请注意,记录的字段输出为单独的行。可以将输入文件提供给脚本,而不是 echo。
我正在使用 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 ...\"
这是我从
#!/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
}
当脚本被调用时 awko
和 chmod +x awko
它可以是 运行 比如:
$ echo "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" | ./awko
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
该脚本尝试转换记录中所有字段的基数,因此以下内容也有效:
$ echo "A B C D E F" | ./awko
1010
1011
1100
1101
1110
1111
请注意,记录的字段输出为单独的行。可以将输入文件提供给脚本,而不是 echo。