将二进制字符串转换为十进制

将二进制字符串转换为十进制

我想用 bash 脚本处理一个如下所示的文本文件:

ADD    $05  $05  $05
SUBI   $06  $06  00011
MUL    $07  $07  $07
JSR    011101

获取二进制数(始终长于 4 位)并将其转换为十进制表示形式。

对于前面的示例,这是我想要最终得到的文件:

ADD    $05  $05  $05
SUBI   $06  $06  3
MUL    $07  $07  $07
JSR    29

我一直在探索trsed,但我认为他们不允许我在替换之前使用匹配的模式(以转换它)。我可以采取什么方法?

编辑:根据@DopeGothi的建议,并且考虑到我每行最多有一个二进制数,我可以创建一个包含二进制数的所有十进制版本的临时文件。问题是现在我需要插入它们:

每次我在第一个文件中找到二进制数时,我都会将文件中相应的数字替换为小数。

答案1

试试这个小bash脚本:

while read -a INP; do for i in ${INP[@]}; do [[ "$i" =~ [^10] ]] || i=$((2#$i));  printf "%s\t" "$i" ; done; printf "\n"; done < file3
ADD     $05     $05     $05 
SUBI    $06     $06     3   
MUL     $07     $07     $07 
JSR     29  

可能会受益于一些抛光。它将文件的行读入数组,测试其元素是否仅包含二进制数字(0 和 1),2#如果是,则在打印之前使用带有基数 2 前缀的“算术评估”

答案2

pack使用 Perl 的和可能有一种更优雅的方法unpack,但使用字符串操作和 的组合oct

$ perl -pe 's/\b[01]+\b/oct "0b" . $&/ge' file
ADD    $05  $05  $05
SUBI   $06  $06  3
MUL    $07  $07  $07
JSR    29

转换二进制、八进制和十六进制数

相关内容