バイナリ文字列を10進数に変換

バイナリ文字列を10進数に変換

bashスクリプトを使用して、次のテキストファイルを処理したいと思います。

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

2進数(常に4桁より長い)を取得し、それを10進表現に変換します。

前の例で最終的に使用したいファイルは次のとおりです。

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

私はナビゲートしてきましたが、tr置き換えるsed前に一致するパターンを使用することを許可していないようです(変換するため)。どうですか?

編集:@DopeGothiの提案に従って、1行に最大1つのバイナリがあることを考慮すると、バイナリのすべての10進数バージョンを含む一時ファイルを作成できます。問題は、これを挿入する必要があるということです。

最初のファイルでバイナリが見つかるたびに、ファイル内の対応する数値を10進数に置き換えます。

答え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

packPerlのsumを使用するよりエレガントな方法があるかもしれませんが、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

バラより2進数、8進数、16進数変換

関連情報