代わりにベース32を使用するのに十分な文字があるのに、なぜ16進数をそれほど使用するのですか?[閉まっている]


0

0〜255の16進数を2文字で格納できるため、データを圧縮し、色、IPアドレス、MACアドレスなどのあらゆる種類のデータに使用されます。

私の質問は、なぜ彼らは16ビットで停止したのですか(またはなぜそれが最も一般的に使用されているのですか)?32ビットのアルファベットには十分な文字があり、0〜65536の範囲が同じ量のスペースに含まれ、わずか1600万ではなく280兆色を可能にします。文字の大文字と小文字を区別し、2つの記号を追加すると、64ビットになり、最大43億の値を2つの文字で表すことができます。


これがうまくいくと思う状況のいくつかの例:

IPv4が不足しています。v6が導入されていることは知っていますが、非常に長く、覚えにくいでしょう。192.168.0.1アドレスを取得し、C0.A8.0.1として保存することもできます。64ビットの16進数を使用し、最大8文字のままにすると、40億個ではなく280兆個の組み合わせを使用でき、この問題は発生しません。

上記のように、それはまた、はるかに広い範囲の色を提供します。RAW写真形式では、ファイルサイズが大幅に増加するという欠点を伴いながら、8ではなく32ビットでカラーチャネルごとに記録されます。RGB値が16進数として保存された場合、色の範囲を増やしてもファイルのサイズは変わらないはずです。ピクセルあたり6ビット以内に保存されますが、ベース番号は大きくなります。代わりに、96ビット/ピクセルの数値として記録されますが、これは1600%の非常に不必要な増加であり、写真は20MBを超えます(オンライン計算機によると、32ビットカラーの4K RAWビデオは2.5GBまで可能です)毎秒)。


この部分は実際には質問とは関係ありませんが、数をバイナリからベース88(その後のシンボルがなくなった)に至るさまざまなベース値に変換できるスクリプトを少し前に書きました。同様のものを実装します。例として、ここでは66000.からの出力です
ベース2:11111111111110000
ベースは16:101D0
ベース32:20EG
ベース64:G7G
コードがあり、ここで誰もが興味を持っているならば、それはまだかかわらず、いくつかのバグを持っていると私はからそれを試してみましたマヤ内。少し話題が外れていますが、通常の16進数は元の数値よりも約20%少ないビットであり、ベース88はほぼ50%削減されていることに気づきました。


最後の1つの質問:写真を16進数として保存するというアイデアを誰かが試みましたか?64ビットの16進数を使用し、[64; 1920; Bgh54D; NgDFF4; ...]のようなデータで写真を保存した場合、機能する可能性がありますか?そうでない場合、私はそれを行うことができる何かを作成しようとするかもしれません。


2
16進数は16を意味するためです!コンピュータサイエンスでの数値表現のデフォルトシステムについて議論したいと思います。最後の段落は私を混乱させます。数字の表現は、人間にとってのみ有用です。コンピュータの場合、それらはまだゼロであり、あなたはそれについて何もすることができません。ゼロと1を文字列形式(各文字が8ビットである)に効果的に書き込むため、最終的に失われます。コンピュータの場合、255は11111111で、16進数ではFFですが、1ではなく2バイトの文字データです。
sinni800 14

しかし、より高い基数の格納に使用されるビットの量は減ります。したがって、それらは文字通り1と0として格納されますが、1000を2進数ではなくbase 64として格納する場合に使用される1と0ははるかに少なくなります。少し複雑に聞こえるかもしれませんが、理にかなっていると思います。編集:ああ、実際に私はあなたが意味することを理解します、私は文字通り文字としてそれを保存することを意味したので、255はFF、ASCIIコードになります高い数字で)
ピーター14

1
@Peter-ありません。また、16進数と16ビットの世界に存在していた32ビットの世界で常に使用されていなかった16進数の16進数を理解する必要があります。
ラムハウンド14

ただし、IPアドレスのようなものが実際にバイナリとして保存されているということは頭にありませんでした。32ビットが常に存在するとは限らないことを完全に忘れていました。それでも、詳細な写真には役立つと思います。
ピーター14

@Peter-これがRAWが存在する理由です。コンピューターによって保存されるバイトとストレージデバイス上のバイトには違いがあります。1つには無限のスペースがあり、もう1つにはスペースが制限されており、メモリレジスタがあります。「バイナリ」ではなく「16進数」でデータを保存する場合、バイナリに戻す必要があることを理解していますか?コンピューターが行うことはすべてビット単位であり、実際にはコンピューターが行うことはすべて電圧ですが、それはまったく異なるコンピューター101の教訓です。
ラムハウンド14

回答:


10

私が質問を正しく読んでいるなら、実際にはそうではないのに、より大きなベースを使用するとデータが「収縮」するということです。

例を挙げてください:ベース2:11111111111110000ベース16:101D0ベース32:20EGベース64:G7G

16進数が標準であるため、そのために101D0を使用します。Base 64表記を使用するとどうなりますか?

答えは次のとおりです。デバイスにビット単位でデータを保存および処理しているため、本質的には何もありません。101D0ではなくG7Gを使用していると言っても、デバイスに11111111111110000を保存して操作しています。数字が5であることを想像してください。それをバイナリで表すと101になります。101には3桁、5には1があります。お使いのコンピューター。

例、IPv6、またはMACアドレス(この例では、同じもの、ドットで区切られた2桁の文字列)を保持します。

16進数で00:00:FF:01:01があります。それはあなたが定期的にそれを表現する方法です。これは、0000 0000 0000 0000 1111 1111 0000 0001 0000 0001としてバイナリに変換されます(おそらく16進数を使用する理由がわかり始めています)。これは簡単です。16= 2 ^ 4なので、1つの16進数を4桁の2進数に変換し、結果をまとめて実際のバイナリ文字列を取得できるからです。Base 64システムでは、GG:HH:01:02:03のようなものがある場合、各文字は6ビットに変換されます。

この問題は何ですか?コンピューターが2のべき乗で内部的に動作するという事実。彼らはあなたが使用している記法を本当に気にしません。CPUレジスタ、メモリ、その他のデバイスでは、6ビットのグループに分割されたデータは表示されません。

TL; DR:16進数は、バイトを2文字(0-F)で表現できるため、人間がバイナリを簡単に理解できるようにするための表記法です。コンピューターで保存および処理されるものは、どの表記法でもそれを読んで。


おかげで、この記事を書いている時点では、コンピューターがそのヘックスを使用していないことを実際には認識していませんでした。私は、より高い基本数で数値を変換することは少なくとも圧縮にはおそらく役立つと考えていましたが、今ではなぜ通常は使用されないのかがわかります。
ピーター

3

16進数は文字通り16を意味します;;)

しかし、ひどい答えは別として、16進数(または他の2のべき乗の基本番号付けシステム)は、バイナリデータを表現するためのよりコンパクトな形式です。最下位レベルでは、値はまだビットで数値で表されます。最下位レベルでは、これらのビットはハードウェアアーキテクチャが簡単に処理できるチャンクに分割されます。

16進数は文字0〜9およびa〜fとして表されないことに注意してください。これらは文字通りビットとして保存されます。 ご提案のとおり、各「数字」は、システムの最初の16個の値のみが使用されている8ビット文字0-255としてエンコードされていません。

例でベース2とベース64の表現を比較してみましょう。

base2: 11111111111110000 --> 17 "digits" with 1 bit per digit = 17 bits
base64: G7G --> need 3 "digits" with 6 bits per digit = 18 bits

次に、各「数字」が実際に8ビット文字で表されるbase64エンコードについて考えます。まだG7Gがありますが、各「数字」には8ビットが必要です。

G7G --> 3 "digits" with 8 bits per digit --> 24 bits

この単純化しすぎた例でも、base64を使用してすべてを表す場合、小さなチャンクでスペースを割り当てるナンバリングシステムよりもはるかに多くのスラック(無駄な)スペースがあります。

前にも言ったように、前の例は単純化しすぎており、符号なしの数値のみを処理している(つまり、負の数値はない)と仮定しています。実際には、データは「ワード」で保存されますが、そのサイズはハードウェアアーキテクチャによって異なります。8ビットのワードがある場合、値を8ビットのチャンクで割り当てる必要があるため、17ビットの値を保存するには24ビットが必要になりました。

したがって、提案されているように2のべき乗のベース番号システムを使用するのは簡単ですが、一般的ではありません。これは、16進数が文字通りハードウェアのネイティブ言語である16ビットアーキテクチャから、人気のある最新のコンピューターアーキテクチャが生まれたためかもしれません。


ええ、ありがとう、私はIPアドレスと物が2文字ではなく8の1と0として保存されていることを知らなかったので、最初のアイデアがうまくいかない理由を理解しています。ただし、文字がそれぞれ8ビットであり、小さい数字の方が効率が悪いことに気付きました。私が提案したイメージのアイデアは、チャネルごとに最大16ビットであり、実際にはあまり効果的ではないように見えますが、そのマークを超えるとうまく機能する可能性があります。
ピーター14

1
ハングアップしているのは、マシンの内部値の表現と、人間として同じ値を視覚化するために使用できるさまざまな表現との境界だと思います。32ビット値を16進数で表現するかバイナリで表現するかに関係なく、32ビット値を保存する必要があります。
ロブ・

1
小さな注意点:16進数は文字通り16を意味し、10進数は10を意味します。いい答えです。
ジミー・ケイン

2

16進数は、2進数と10進数のかなり良い妥協点のようです。

  • 見ているだけでバイナリに変換するのは簡単です。

  • 必要に応じて、読みやすく、書きやすく、口頭でコミュニケーションしやすい。電話でbase64エンコードされた文字列を誰かに伝えようとすることを想像してください。

  • 70年代および80年代のシングルボードコンピューターには、7セグメントLEDが搭載されており、他のディスプレイメカニズムは搭載されていませんでした。幸いなことに、A、B、C、D、E、およびFはすべて、これらのいずれかでレンダリングできます。

もちろん、64ビット、128ビット、およびそれ以上の量、またはハッシュのようなものについて話すとき、16進数、10進数、または実際に何かで通信することは容易ではありません。私にとって、16進数の「全盛期」とは、8ビットと16ビットのCPUが一般的であり、低レベルのプログラミングがより必要であるために一般的だったときでした。私は間違っている可能性があります。

C / C ++でポインターのアドレスを表す場合を除いて、hexが一般的に使用されているかどうかはわかりません。ここでは、ヘックスは習慣や伝統から使われていると思いますが、何かが「生のバイナリ」値であり、実際には「タイプ」ではないことを示すシグナルにもなりました。

写真を16進数として保存するというアイデアを誰かが試みましたか?

ファイルは、その種類や内容に関係なく、大きなバイトの塊です。すでにバイナリです。Hexは、それについての(最小限の)人間に優しいビューです。

16進形式でファイルのバイト数を確認したい場合は、それを行う多数の16進エディターとビューアーがあります。

16進数のリストを含むテキストファイルとして写真を保存することを提案している場合、必要に応じてそれを行うことができると思いますが、元のファイルよりも大きく、処理が遅くなります。


おかげで、私の写真のアイデアには多くの処理が必要になることがわかりましたが、大きな写真を効果的に圧縮できるかどうかを確認するために、いつか試してみたいと思います。質問を書いているとき、IPアドレスとそのロットが実際に8バイトを使用していることを知りませんでしたが、文字通り2文字として保存されていると思いました。
ピーター14

元のデータ(たとえば、元の.jpg)を取得し、テキスト16進形式に変換するときにそれを展開しています。代替表現を使用して圧縮すると、元のバイナリのサイズに近づくことはありません。元のバイナリには、バイトが保持できる256個の値ごとに256個の「シンボル」があります。シンボルの数が少ない場合、最終的には常により大きな表現になります。
ローレンス

jpgファイルや基本的にチャネルあたり16ビット未満の場合は効率が低下することはわかっていますが、未圧縮の生の写真の場合は、かなりうまく機能する可能性があると考えています。それがうまくいくかどうかわからないので、私はそれを試してみたいと思う理由です。
ピーター14

それを試してみてください、それは良い学習体験になります。RLE、DCT、gzip、lzma、Huffmanなど、すでに多くのアルゴリズムがあります。
LawrenceC 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.