プレーンテキストデータの保存は、同等のメッセージをバイナリで保存するよりもスペースを取りませんか?


32

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

私は、「こんにちは。」の文章を取るバイナリに変換し、SQLデータベース内のバイナリとしてそれを保存する場合、思わ文字よりも多くのスペースを取るだろう、1と0のように。文字を使用することは、1つの記号が複数を表す圧縮を使用するようなものです。

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

プレーンテキストデータの保存は、同等のメッセージをバイナリで保存するよりもスペースを取りませんか?


126
すべての開発者が文字エンコーディングについて知っている必要のある絶対的な最小値はわかりません。幸いなことに、このサイトの創設者はあなたに記事を書きました。再度プログラムする前に読んでください。joelonsoftware.com/2003/10/08/…–
エリック

16
@EricLippert素晴らしい読み物であり、結果として私は幸いです。ありがとう。
ジョンドー


2
Web開発者であることは、文字エンコーディングとバイナリデータの仕組みを知らない言い訳にはなりません。あなたは本当にあなたのスキルを磨く必要があります...
T. Sar-Reinstate Monica

回答:


134

平文はバイナリです。

Hハードドライブに書き込みを行う場合、書き込みヘッドは2本の垂直線と1本の水平線をプラッタに刻むことなく、ビット010010001をプラッタに磁気的にエンコードします。

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

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

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

プレーンテキストを使用して表現する内容によっては、異なるバイナリ形式を使用して同じ情報を表現できる場合があります。これにより、より多くのスペースが使用される場合がありますが、使用量が少なくなる場合があります。

たとえば、数字5と数字は数字を1234567使用して平文で表すことができ、ディスク3でこれらのビットシーケンスが発生します。

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または、実際には、さまざまなエンコーディングが指定されたいくつかの形式。

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


6
わずかな違いは、行末の表現です。Unix/バイナリでは1バイト(LF)を、Windows /テキストでは2バイト(CR-LF)を使用します。
グレンランダース-パーソン

97
以下のための1 書き込みヘッドは「プラッタに2本の垂直線と水平線を彫るしません
Tulainsコルドバ

@BaardKopperudあなたは正しいです!;)
TulainsCórdova17年

2
@BaardKopperud LightScribeがあります/ありましたが、それは実際にはコンピューターの読み取り用ではありませんでしたが、おそらくGoogleゴーグルのようなものはLightScribeのラベルを読むことができました。しかし、実際のデータストレージ側でそれを行うことは非常に興味深いでしょう。オシロスコープを介して実行すると、派手なグラフィックスを持つ曲を思い出します。
8ビットツリー

2
@TulainsCórdova実際には、チューリングマシンは任意のアルファベットで動作するため、理論的にはテープに文字を書き込むことができます。2シンボルのアルファベットを使用することに決めたのです。
ガーデンヘッド

15

これはとても楽しいことだと思います。あなたがそれについて話す方法で、バイナリは1と0ではありません。

数量があると想像してください。数量はさまざまな方法でわかります。

  • Nine 英語で
  • Neuf フランス語で
  • 9 アラビア数字
  • IX ローマ数字で
  • 1001 アラビア数字付きのバイナリ
  • on off off on オン/オフのバイナリで
  • high low low high 電圧またはレバーまたは水位または電荷で表されるバイナリ...または英語の単語「高」および「低」

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

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

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

しかし、「Hをバイナリに変換してhigh low high low high low high low、35文字かかるように表現した場合、それはさらに多く!!」というロジックによって、バイナリは数量を表す1つの方法であることがわかります10101010。 ..では、一方は他方よりも大きいのでしょうか?

この他の側面は、どのように不思議にあるHコンピュータによって格納され、それが見てH同じ量-ちょうど量を表す方法自体で7201001000またはseventy twoまたはASCII文字コードH。これは、プレーンテキストバイナリであるという8bittreeの答えですが、これは私がそれが何を意味するかを示すことを試みています

それで、あなたはコンピューターで少しパターンを取得し、01001000それはどういう意味ですか?何でも-数字として、zipファイルの一部として、キャラクターとして、それを作成した人の意図が何であるかに依存します。プレーンテキストであることがわかっている場合は、文字エンコードから取得されますH-> 01001000文字エンコードテーブルで別の方法で検索します-ASCII、UTF-8、shift-jisなど、適切なフォントを見つけますキャラクターと出てくるものはH何でも。または、作成者が使用したエンコードルックアップとは異なるエンコードルックアップを使用すると、間違った文字が出力されます。これは@Eric Lippertのリンクです。

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


12

プレーンテキストデータの保存は、同等のメッセージをバイナリで保存するよりもスペースを取りませんか?

いいえ、決して。

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

文字を使用することは、1つの記号が複数を表す圧縮を使用するようなものです。

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

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


3
まあ、たぶん時々:-)私が考えることができる2つの可能なケース。1)圧縮する短いテキスト文字列があります。圧縮ファイルにはメタデータが含まれているため、圧縮ファイルは元の文字列よりも大きくなります。2)1.2などの浮動小数点値があります。テキストとして保存すると3バイト(ターミネータ付きの4)になり、バイナリdoubleを保存すると8バイトかかります。
-jamesqf

5
答えは本当に「バイナリ」の意味に依存します。たとえば、UTF-32はASCIIの4倍のスペースを占有するため、「プレーンテキスト」でASCIIを意味し、「バイナリ」でUTF-32を意味する場合、プレーンテキストバイナリよりもスペース取りません。ただし、定義を逆にして反対の結果を得ることができます。
デビッドコンラッド

1
@DavidConradまあ、それは「プレーンテキストのようなものはありません」のスカートです。最も近いものは、タイプを識別し、「XXXとしてエンコードされたテキストである必要がある」と推測するメタデータ/ヘッダーのないバイナリファイルです。「プレーンテキストファイル」は、限られたコンテキストで合理的なものを意味する時代がありましたが、実際にはもうありません。「ファイル内のすべてのデータはテキストとしてエンコードされます」とは対照的に、「データの一部/すべての部分はテキストとしてエンコードされません」が得られます。
ルアーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.