web-dev-qa-db-ja.com

平文のデータを保存すると、同等のメッセージをバイナリで保存するよりも場所を取りませんか?

Web開発者として、私はバイナリデータについてほとんど理解していません。

「Hello world。」という文を受け取り、それをバイナリに変換して、SQLデータベースにバイナリとして保存すると、1と0のようにseemsは文字よりも多くのスペースを必要とします。文字を使用することは、1つの記号が複数を表す圧縮を使用するようなものだと私は思われます。

しかし、それは本当にそれがどのように機能するのでしょうか?

平文のデータを保存すると、同等のメッセージをバイナリで保存するよりも場所を取りませんか?

32
john doe

プレーンテキストはバイナリです。

Hをハードドライブに書き込むとき、書き込みヘッドは2本の垂直線と1本の水平線をプラッターに刻みません。ビットは磁気的にエンコードされます010010001 大皿に。

そこから、プレーンテキストデータを保存することは、バイナリデータを保存することとまったく同じ量のスペースを占めることは明らかです。

しかし、平文はただの1つです2 特定のバイナリ形式

平文は、他のバイナリ形式に可逆的に変換できます。一般的な変換の1つは圧縮です 通常 はよりコンパクトな表現になります。つまり、同じ情報を表すために使用されるビットが少なくなります。

プレーンテキストを使用して何を表現しているかに応じて、同じ情報を表すために異なるバイナリ形式を使用できる場合があります。これは、より多くのスペースを使用する可能性がありますが、使用する可能性は少なくなります。

たとえば、数字5および1234567は、数字文字を使用してプレーンテキストで表すことができ、ディスク上でこれらのビットシーケンスが生成されます。

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

または、32ビット 2の補数 を使用することもできます。

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

これは、5のコンパクトな表現ではありませんが、1234567のコンパクトな表現です。

そして、文字通り無限の数の他の表現があり、それらはさまざまなレベルのコンパクトさと柔軟性を持ちますが、実際には多くの表現が実際に使用されているものよりはるかに少ないです。


1 UTF-8を想定しています。文字の正確なビットシーケンスは、使用している特定のエンコーディングによって異なります。

2 または、実際には、さまざまな encodings を指定したいくつかの形式。

 両端の8つのゼロが何であるか疑問に思っている場合は、データの長さを知る方法が必要です。オプションは基本的にマーカー(nullバイトを介してこれを使用しました)、長さを格納するための専用スペース(Pascalは文字列の長さを格納するためにバイトを使用しました)、または固定サイズ(後続の2の補数で使用されます)例)。

134
8bittree

これについて考えるのはとても楽しいことだと思います。 Binaryは、1と0ではありません。

量があることを想像してみてください、それは多くの異なる方法でそれが何であるかをあなたに伝えることができます:

  • Nine(英語)
  • フランス語でNeuf
  • 9アラビア数字
  • ローマ数字のIX
  • 1001アラビア数字の2進数
  • on off off onバイナリのオン/オフ
  • high low low high電圧、レバー、水位、または電荷で表されたバイナリ...または英語の単語「high」と「low」

それらはすべて同じものを表しています。ここでのポイントは、バイナリが1と0ではないことです。これは、値を表す唯一の方法です。

Hをバイナリに変換することについて話すとき、おそらく画面上に10101010が表示されることを想像しますが、これは「バイナリ」ではなく、各バイナリビットに対して1桁です。

はい、人々が通常それを話すようにHを「バイナリ」に変換し、それをアラビア数字で表してから保存すると、Haitchに変換するのと同じ方法でより多くのスペースが必要になります。

しかし、バイナリは数量を表す1つの方法であることがわかります。「Hをバイナリに変換してhigh low high low high low high lowそれでは35文字必要です!それは10101010!しかし、これら2つはどちらも「バイナリ」です。では、一方が他方よりもどのように大きいのでしょうか。

これの反対側は、Hがコンピューターによってどのように格納されるのかを疑問に思い、H自体が数量を表す方法の1つにすぎないことを確認することです-同じ数量7201001000、またはseventy twoまたはASCII文字コードH。これは、プレーンテキストisバイナリという8ビットツリーの答えですが、これは、そのことを表示しようとしていることです手段 =。

したがって、コンピュータでビットパターンを取得します01001000とはどういう意味ですか?何でも-数字として、Zipファイルの一部として、文字として話されるかもしれませんが、それを作成した人の意図が何であったかによって異なります。プレーンテキストであることがわかっている場合は、文字エンコードH-> 01001000そして、あなたはそれを文字エンコーディングテーブルで他の方法で調べます-ASCII、UTF-8、シフトジスなど。そして適切なフォント文字を見つけて、Hか何かが出てきます。または、作成者が使用したのとは異なるエンコーディングルックアップを使用すると、間違った文字が表示されます。これは@Eric Lippertのリンクです。

しかし、私がこれを書いているとき、そしてあなたが考えているように、Hは1バイトであり、01001000は8バイトです。はい、それはより多くのスペースです。そして、はい、それはバイナリ(の表現)です。しかし、それはコンピューターが使用しているよりも高いレベルの抽象化です-バイナリはASCII文字で表示されます。各文字は、Hと同じ大きさのバイナリビットパターンで舞台裏で表されます。

16

平文のデータを保存すると、同等のメッセージをバイナリで保存するよりも場所を取りませんか?

いいえ、ありません。

お使いのコンピューターは、プレーンテキストデータを同等のバイナリ表現で既に格納しています。何かをプレーンテキストとバイナリのどちらで保存するかは、コンピュータが同一バイナリストリームをどのように解釈すべきかを示すだけです。

文字を使用することは、1つの記号が複数を表す圧縮を使用するようなものだと私は思われます。

それはちょっと本当です。 1つの文字は複数のビットを表します。問題は、サイズが異なることです。 1または0を格納するのに1ビットしかかかりませんが、プレーンテキスト文字を格納するのに8ビット(またはそれ以上)かかります。キャラクターを使用しても何も得られません。

もしあれば、逆に圧縮できます。結局のところ、8ビットは256の異なる可能な値ですが、プレーンテキストは通常​​、文字、数字、およびいくつかの句読文字に制限されています。必要なビット数は必要ありません。

13
Telastyn