3

このトピックについて読んでいて、私の質問に関する特定の情報が得られませんでした:

(以下は間違っているかもしれませんが、訂正してください)

すべてのファイル (テキスト/バイナリ) はBYTESを保存しています。

バイトは 8 ビットであるため、最大値は2^8-1 = 255コードです。

これらの 255 のコードは、2次のグループに分けられます。

0..127 : textual chars
128:..255 : special chars.

したがって、バイナリファイルには、範囲全体の文字コードが含まれています: 0..255( ascii chars + special chars)。

1) 正しいですか?

2)さて、1つのINTをバイナリファイルに保存するとしましょう。(32ビットシステムでは4バイト)

ファイルはどのようにプログラムにそれを読み取るように指示しますか:無関係な 4 バイトではなく 4 バイトの intですか?is

4

3 に答える 3

3

基になるすべてのファイルはバイトとして保存されているため、ある意味であなたの言っていることは正しいです。ただし、バイナリとして読み取ることを意図したファイルを開いてテキスト エディタで読み取ろうとすると、意味不明に見えます。

プログラムは、ファイルをテキストとして読み取るか、バイナリとして読み取るかをどのように判断しますか? (つまり、ASCII またはその他のエンコードされたバイトの特別なセットとして、または別の表現を持つ基礎となるバイトとして)?

ええと、それはわかりません - 言われたことをするだけです。

Windows では、.txtメモ帳でファイルを開きます。メモ帳は、テキストを読み取ることを想定しています。バイナリ ファイルをメモ帳で開いてみてください。それは開き、物が見えますが、ゴミになります。

独自のプログラムを作成している場合は、すべてをバイナリとして保存する場合は、を使用して書き込み、使用BinaryWriterして読み取ることができます。を使って書き、 を使って読むとBinaryReaderどうなるでしょうか?BinaryWriterStringReader


特定の例に答えるには:

using (var test = new BinaryWriter(new FileStream(@"c:\test.bin", FileMode.Create)))
{
    test.Write(10);
    test.Write("hello world");
}

using (var test = new BinaryReader(new FileStream(@"c:\test.bin", FileMode.Open)))
{
    var out1 = test.ReadInt32();
    var out2 = test.ReadString();

    Console.WriteLine("{0} {1}", out1, out2);
}

書かれているのと同じ順序で読む必要があるのがわかりますか? ファイルは何も教えてくれません。

次に、2 番目の部分を切り替えます。

using (var test = new BinaryReader(new FileStream(@"c:\test.bin", FileMode.Open)))
{
    var out1 = test.ReadString();
    var out2 = test.ReadInt32();

    Console.WriteLine("{0} {1}", out1, out2);
}

あなたは意味不明になるでしょう(それがまったく機能する場合)。しかし、事前にそれを教えてくれるファイルを読み取ることができるものは何もありません。そこには特別な情報はありません。プログラムは、帯域外の情報 (ある種の仕様) に基づいて何をすべきかを認識している必要があります。

于 2012-04-29T07:07:58.583 に答える
2

したがって、バイナリファイルには、0..255(ascii chars + special chars)の全範囲のcharコードが含まれます。

いいえ、バイナリファイルにはバイトが含まれています。0から255までの値。それらにその意味を帰することにした場合にのみ、それらは文字と見なされるべきです。バイナリファイル(JPEGなど)の場合は、そうしないでください。画像データのバイト65は論理的に「A」ではありません。ファイルのその時点でのバイト65の意味は何でもかまいません。

(テキストファイルでさえ「ASCII文字」と「特殊文字」に分割されないことに注意してください-それはエンコーディングに依存します。UTF-16では、各コードユニットはその値に関係なく2バイトを取ります。UTF-8ではバイトは、表現しようとしている文字によって異なります。)

ファイルはどのようにプログラムにそれを読み取るように伝えますか:その4つの単一の無関係なバイトではなく、4バイトのintですか?

このファイルはプログラムに通知しません。プログラムは、ファイルの読み取り方法を知っている必要があります。メモ帳にJPEGファイルを開くように依頼しても、画像は表示されません。ぎこちない画像が表示されます。同様に、画像ビューアにJPEGであるかのようにテキストファイルを開かせようとすると、ファイルが壊れていると文句を言います。

データを読み取るプログラムは、読み取るデータの構造を理解する必要があります。つまり、何を期待するかを知っている必要があります。XMLのように、形式が非常に柔軟な場合もあります。明確に指定されたレイヤーがありますが、プログラムは、要素や属性など、より高いレベルの意味を持つ値を読み取ります。それ以外の場合、形式は完全に正確です。 llは4バイトの整数で始まり、次に2つの2バイトの整数などです。フォーマットによります。

編集:あなたの特定の(繰り返される)コメントに答えるには:

ImCmdシェル....バイナリファイルを作成しました。私はあなたがそこで何をしたのか分かりません。4つのシングルバイトを読み取るか、4バイトを1回として読み取るかをどのように知ることができますか?

データを読み取るプログラムは、データの意味を知る必要があるか、知らないかのどちらかです。ファイルをある場所から別の場所にコピーするだけの場合は、データの意味を知る必要はありません。一度に1バイトコピーするか、一度に4バイトすべてをコピーするかは関係ありません。

データの意味を知る必要がある場合、それが4バイト整数であることを知っているだけでは、あまり役に立ちません。その整数が、データで役立つことを何を意味するのかを知る必要があります。それで、コマンドシェルから書かれたファイル...それはどういう意味ですか?それが何を意味するのかわからない場合、一度に1バイトを読み取るか、整数として4バイトを読み取るかを知っているかどうかはどうでしょうか。

(前述したように、コードが意味のない構造を理解し、その構造を他のコードに公開して意味を課すことができる中間オプションがあります。XMLはその典型的な例です。)

于 2012-04-29T07:20:29.447 に答える
1

それはすべて解釈の問題です。ファイルもシステムも、ファイルで何が起こっているのかを認識していません。ストレージを、それ自体ではまったく意味のない一連のバイトとして認識しているだけです。単語を読んだときも同じことが脳内で起こります(文字のシーケンスに意味を与えるために、それを解釈する言語を選択しようとします)。

有効な解釈は1つもないため、データを希望どおりに解釈するのはプログラムの責任です。たとえば、バイトのシーケンスは次の48 65 6C 6C 6F 20 53 6F 6F 68 6A 75 6Eように解釈できます。

  • 文字列(Hello Soohjun
  • 12個の1バイト文字Hのシーケンス(、、、、、、、、、、、、、、、)_ _ _elloSoohjun
  • 3つの符号なしintとそれに続く文字のシーケンス(1214606444、1864389487、1869113973、110)
  • 文字、float、unsigned int、float(72、6.977992E22、542338927、4.4287998E24)など...

あなたはそれらのバイトの意味を選択する人です、別のプログラムはまったく同じデータの異なる解釈をします、文字の組み合わせが英語とフランス語で異なる解釈を持っているのとほとんど同じです。

PS:ちなみに、それがファイル形式のリバースエンジニアリングの目標です。各バイトの意味を見つけてください。

于 2012-04-29T07:29:20.137 に答える