web-dev-qa-db-ja.com

Base64値の整数を確認するにはどうすればよいですか?

Base64 の整数値を確認したいと思います。 base64 linuxコマンドがありますが、整数に適用する方法がわかりません。

base64 10で試しましたが、エラーメッセージbase64: 10: No such file or directoryが表示されます。

問題は、Base64がバイナリからテキストへの変換に使用されているため、テキスト引数を渡す意味がないことだと思います。したがって、私の引数10は、2進数ではなく、テキスト文字列として読み取られます。テキストの引数をバイナリに変換する方法はありますか?

Base64コマンドを使用して整数のBase64値を取得するにはどうすればよいですか?

2
Jonas

数値を16進数に変換し、echoを使用して対応するバイトシーケンスを出力し、それをbase64にパイプします。したがって、整数10をbase64でエンコードするには、次を使用できます。

echo -en '\xA' | base64

結果を説明するため。バイト10には、次のバイナリ表現があります。

00001010

Base64が行うことは、それらを6ビットのグループにチャンクすることです。したがって、パディングを使用すると、次の2つの6レットが得られます。

000010 100000

10進数で2と32であり、文字Cとgに対応します。

4
sepp2k

以下のコマンドは、10進整数を基数64に変換します。Base64エンコード方式は使用しませんが、Base64エンコード方式のURLセーフバリアントで使用される文字を数字として使用します。

awk 'NR==FNR{a[NR-1]=$0;next}{if($0==0){print"A";next}o="";for(n=$0;n!=0;n=int(n/64))o=a[n%64]o;print o}' <(printf %s\\n {A..Z} {a..z} {0..9} - _) -

以下のコマンドはBashでも同じことをします。 _l%64_を_l%64+1_に置き換えると、Zshでも機能します。

unset a;a=({A..Z} {a..z} {0..9} - _);while IFS= read l;do if ((l==0));then echo A;continue;fi;o=;for ((;l!=0;l/=64));do o=${a[l%64]}$o;done;printf %s\\n "$o";done

これにより、基数64が10進数に変換されます。

awk 'NR==FNR{a[$0]=NR-1;next}{o=0;for(i=NF;i>=1;i--)o+=a[$i]*64^(NF-i);print o}' FS= <(printf %s\\n {A..Z} {a..z} {0..9} - _) -

これはBashでも同じです。

unset a;i=0;declare -A a;for x in {A..Z} {a..z} {0..9} - _;do a[$x]=$((i++));done;while IFS= read l;do o=0;for((i=${#l};i>=1;i--));do let o+=${a[${l:i-1:1}]}*64**(${#l}-i);done;echo "$o";done

awkコマンドを使用すると、_2**53+1_以上の数値で精度が低下しますが、それを回避するには、gawk 4.1に_-M_(_--bignum_)を追加できます。以降。

Bashコマンドを使用すると、_2**63_以上の数値で整数オーバーフローが発生します。

0
nisetama