2つの32ビット桁を12文字列にパックしたい例123456->abcdef0000000
3 に答える
[0-9a-z]を選択すると、36個の記号が表示されます。このような12個の記号を使用すると、36 ^ 12=4.7e18の異なる文字列が得られます。
3つの32ビット桁は1つの96ビット桁と同じであり、2 ^ 96=7.9e28の異なる値があります。
そのアルファベットで12桁で表現できるよりも多くの桁があるので、いいえ、希望するパッキングを達成することはできません。
[0-9a-zA-Z]を使用すると、62個のシンボルがあります。62 ^ 12=3.2e21-まだ短い。
シンボルの数Sと文字列の長さLが与えられると、S ^ L> = 2 ^ Bを解くことにより、格納できる情報のビット数を把握できます。あなたの場合、B = 96です。Base64アルファベットを使用して、S = 64にします(これにより、計算も簡単になります)。それで:
64^L >= 2^96
take log2 of both sides
L * log2(64) >= 96 * log2(2)
L * 6 >= 96
L >= 16
したがって、Base64アルファベットを使用すると、16個のシンボルに96ビットを格納できます。
あなたが3つの数字を意味すると仮定します:
それらを文字列で取得できるかどうかは、言語によって異なります。ただし、文字セットに制限を設けることはできません。32ビットの数値は4バイトで、そのうち3つは12バイトになります。ゼロは可能性があります-文字列にゼロバイトを格納できない言語では、これは許可されません。ただし、気にしない言語もあります。Delphiが思い浮かびます。ターミネータではなく長さコードで文字列を格納するため、文字列に何でも入れることができます。
あなたが2つの数字を意味すると仮定します:
[0-9][AZ]は36個の記号です。36 ^ 6 <2 ^ 32、動作しません。
[0-9][AZ][az]は62個の記号です。62 ^ 6> 2 ^ 32、あなたはそれを行うことができます。
一方、あるタイプのワイド文字を保持する文字列を話している場合は、3つの数字でも簡単に詰め込むことができますが、その作業を行うには非ASCII文字を使用する必要があります。256個のシンボルを選択すれば、準備は完了です。2048個の記号を選択して(東アジアの言語を見るとそれ以上のものが見つかります)、各数字を3文字にまとめることもできます。
実際には、3つの4バイトの長さの数値を1つの12バイトの長さの文字列に圧縮する必要があります。はい、これは可能ですが、256個のANSIシンボルすべてを使用する必要があり(#13、#7、#10など、一部は印刷できません)、最初の4つだけで「パック」になることもありません。バイトは1つの数値を保持し、2番目の4バイトは2番目の数値を保持し、3番目の4バイトは3番目の数値を保持します。
2つの4バイトの数値を長さ12の読み取り可能な(印刷可能な)文字列にパックする場合は、4バイトを文字列の6つの「数字」に詰め込むことができる必要があります。ありがたいことに、12は2で割り切れます。パックの長さが不均一である必要があります。したがって、256 ^ 4 <= X ^ 6を解くと、Xは41として受け取られます。つまり、Base64アルファベットを使用すると(前のandwerへのコメントのように)、そのような文字列を使用できます。