Base64 の整数値を確認したいと思います。 base64
linuxコマンドがありますが、整数に適用する方法がわかりません。
base64 10
で試しましたが、エラーメッセージbase64: 10: No such file or directory
が表示されます。
問題は、Base64がバイナリからテキストへの変換に使用されているため、テキスト引数を渡す意味がないことだと思います。したがって、私の引数10
は、2進数ではなく、テキスト文字列として読み取られます。テキストの引数をバイナリに変換する方法はありますか?
Base64コマンドを使用して整数のBase64値を取得するにはどうすればよいですか?
数値を16進数に変換し、echo
を使用して対応するバイトシーケンスを出力し、それをbase64
にパイプします。したがって、整数10をbase64でエンコードするには、次を使用できます。
echo -en '\xA' | base64
結果を説明するため。バイト10には、次のバイナリ表現があります。
00001010
Base64が行うことは、それらを6ビットのグループにチャンクすることです。したがって、パディングを使用すると、次の2つの6レットが得られます。
000010 100000
10進数で2と32であり、文字Cとgに対応します。
以下のコマンドは、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
_以上の数値で整数オーバーフローが発生します。