テキストエディタでバイナリファイルを開くと、バイナリコードが表示されないのはなぜですか?たとえば、テキストエディターで画像を開くと、奇妙な文字と人間が読める文字が表示されます。ただし、画像はバイナリでエンコードする必要があります。
テキストエディタでバイナリファイルを開くと、バイナリコードが表示されないのはなぜですか?たとえば、テキストエディターで画像を開くと、奇妙な文字と人間が読める文字が表示されます。ただし、画像はバイナリでエンコードする必要があります。
回答:
バイナリデータとテキストデータは分離されていません。単にデータです。それらをどちらにするかの解釈に依存します。テキストエディターでバイナリデータ(イメージファイルなど)を開くと、選択した解釈(テキストとして)に合わないため、その多くは意味を成しません。
あなたがテキストと呼ぶものは、可能なファイルの内容のサブセットです:与えられた文字セットのデータは読み取り可能な文字に変換されます。
たとえば、ASCIIでは、128個の「許可」値のうち、約半分のみが文字と数字、30個が句読点、残りが制御文字であることがわかります。後者のグループはテキストファイルではあまり使用されておらず、実際のテキスト表現はあまりありません。それらのいくつかは、タブおよび改行文字であり、テキストエディターはそれらを表示する際に創造性を得る必要があります。
一部のテキストエディタには、空白を明示的に表示するオプションがあります。次に、通常の書式設定動作(これらの文字の単なる解釈でもあります)に加えて、実際には文字として描画されます。
純粋なASCIIは128個の値のみを解釈します。この情報を保存するために使用されるバイトにはそれぞれ256の可能な値があるため、ASCIIでは可能な値の半分は許可されていません。これらは、たとえばラテン語1などの地域固有の文字セットで使用されますが、ASCIIでは未定義です。ASCIIのみを処理できるテキストビューアーには、有用な表現がありません。
通常、バイナリデータはテキストとして解釈されません。したがって、これらのファイルでは、考えられるすべてのバイト値が一般的に見つかります。それ以外はすべて無駄です(そして、それがテキストを非常にうまく圧縮できる理由です)。画像ファイル形式は複雑であり、通常はテキストとして表示されないため、読みやすくする必要はありません。
すべての可能な値を読み取り可能な文字にマップする一般的なデータ解釈(文字セット)はなく、それは(読み取り可能なテキストではないので)あまり意味をなさないため、主要な部分は意味不明に表示されます。
16進エディタは、データの異なる表現を選択します。各バイトを2 桁の16進数として表示します。これは単に異なる表現であり、人間が読みやすい文字セットを使用したものです。256個の可能なバイト値はすべて、2桁の16進数で表現できます。
バイナリデータの16進数へのマッピング(および1桁の16進数から4桁のバイナリバイナリ)が簡単であり、バイナリには1桁あたりの情報がほとんどないため、一般的には、16別の表現を好む理由。
一部のテキストエディターには、16進エディターモードと、ファイルがテキストかバイナリかを判別し、いずれかのモードを自動的に選択しようとするヒューリスティックがあります。しかし、これを正しく行うのは難しい場合があり、ファイルの特定のプロパティではなく、それが1つの種類であるか他の種類であるかを示します。
一部のFTPクライアントは、テキストファイルに使用されるファイルの末尾を指定するように要求します。これらのプログラムは、Windows CR/LF
がLinuxおよびUnix(Mac OS X;を含む)とは異なる行末文字シーケンス()を使用するため、接続しているマシンのOSに一致するようにファイルの内容を変更しますLF
。
コンテキストと解釈に関係しています。コンピューターにあるのは、高電圧と低電圧のパターン、またはディスクの磁化された領域であり、それらを解釈する方法を決定したときにのみ意味を持ちます。
状況が異なると、パターンlow-high-low-low-low-low-low-low-highは、数字65、大文字の「A」、空色、顧客がコーヒーを注文したこと、日付「3月」を意味する場合があります6th 'または何でも、本当に。
グラフィックスプログラムで画像ファイルを開くと、画像ファイルを画像として解釈し、どのパターンが画像フォーマットを示し、どのパターンが画像サイズを示しているかなどがわかります。
テキストエディターで画像ファイルを開くと、テキストとして扱われます。これは、コンピューターで実際に行われているものに非常に近い非常に単純な形式ですが、まだいくつかの解釈が行われています。具体的には、ほぼすべてのパターンが特定の文字、AZのような通常の文字、および奇妙な文字として解釈されます。いくつかのパターンは文字として表示されず、代わりに基本的な書式設定として扱われます:改行、タブ。
(状況は、UnicodeやUTF-8などのテキストエンコーディングなどによって多少複雑になっていますが、ここでは簡単にするためにここでは扱いません。)
バイナリファイルをテキストエディターで開いている場合は、変更を加えないように注意してください。ほとんどの変更は、ファイルの内容の通常の解釈を完全に混乱させるため、ファイルを台無しにして使用できなくなります。
簡単な例として、テキストエディターで開いた画像ファイルを考えます。
画像は単純なチェスパターンで、3ピクセルの幅の正方形と、各正方形の間に1ピクセルの灰色の境界線があります。-3つの黒いピクセル、灰色の境界ピクセル、3つの白いピクセル、灰色の境界ピクセル、繰り返し。
その画像の最初の行には、次の値が4回あります。
Black Black Black Gray White White White Gray
0x000000 0x000000 0x000000 0x7F7F7F 0xFFFFFF 0xFFFFFF 0xFFFFFF 0c7F7F7F
(バイナリではなく16進数-バイナリの文字列は4倍の長さになります-0x7Fは0b01111111に置き換えられます)
そのデータの文字列をテキストエディターに読み込むと、次のテキストが表示されます。
[Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Del] [Del] [Del] [Blank] [Blank] [Blank] [Blank] [Blank] ] [Blank] [Blank] [Blank] [Blank] [Del] [Del] [Del]
これは、0x00がNull値のASCIIコードであり、黒ピクセル(とにかく24ビットBMP)の値を取得するために3回書き込む必要があり、3つの黒ピクセルがあるためです。0x7FはDeleteのASCIIコードであり、グレーのピクセルを取得するには3回必要です。0xFFは、特に拡張ASCIIセットであっても、何に対してもASCIIコードを無効にするものではありません。また、3つの白いピクセルを得るために9回書き込む必要があります。それを終えると、さらに3つの削除を取得してグレーのピクセルを書き込みます。
それを表示する別の方法は、より有用な説明かもしれませんが、逆の例です-テキストエディターで開いたときに0と1を取得するためにファイルに何を書き込む必要がありますか?
もちろん、0と1のASCIIコードです!テキストエディターのゼロは、値0の単一ビットとして保存されるのではなく、値0b00110000の8ビットとして、または16進0x30として保存されます。
「0」のASCIIコードは0x30、「1」のASCIIコードは0x31です。したがって、チェスパターンをゼロと1として保存する場合、ファイルは次のようになります。
text editor:
10101010
01010101
10101010
01010101
Stored data (ASCII values for '1', '0' and 'new line'):
0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x0D 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31
これにはもっと多くのことがあります-ファイルには開始と停止、メタデータ、その他すべての種類がありますが、テイクホームのレッスンとあなたの質問への答えは:
ファイルの最初の8ビットが0b00110000でない限り、テキストエディターは「0」を書き込みません。これは、「0」という文字のASCIIコードだからです。ファイルの最初の8ビットが0b00110001でない限り、テキストエディターは「1」を書き込みません。これは、文字「1」のASCIIコードだからです。
エディターは、一部のテキストが意味を成すかどうかを判断するのに十分なほどスマートではないため、その機能があれば、特に指示がない限り、任意のファイルをテキストとして表示します。他の人が指摘したように、一部のエディターには16進数を表示する機能があります。