7

「読めない」内容のファイルを効果的に無視したいので、「テキストファイル」と「バイナリ」ファイルを区別しようとしています。

GZIP アーカイブと思われるファイルがあります。マジック ナンバー / ファイル シグネチャを検出して、この種のファイルを無視しようとしています。Notepad++ で Hex エディター プラグインを使用してファイルを開くと、最初の 3 つの 16 進コードが1f 8b 08.

ただし、を使用してファイルを読み取った場合StreamReader、元のバイトに到達する方法がわかりません..

using (var streamReader = new StreamReader(@"C:\file"))
{
    char[] buffer = new char[10];
    streamReader.Read(buffer, 0, 10);
    var s = new String(buffer);

    byte[] bytes = new byte[6];
    System.Buffer.BlockCopy(s.ToCharArray(), 0, bytes, 0, 6);
    var hex = BitConverter.ToString(bytes);

    var otherhex = BitConverter.ToString(System.Text.Encoding.UTF8.GetBytes(s.ToCharArray()));
}

using ステートメントの最後には、次の変数値があります。

hex: "1F-00-FD-FF-08-00"
otherhex: "1F-EF-BF-BD-08-00-EF-BF-BD-EF-BF-BD-0A-51-02-03"

どちらも Notepad++ に示されている 16 進値で始まりません。

経由でファイルを読み取った結果から元のバイトを取得することは可能StreamReaderですか?

4

3 に答える 3

7

コードは、バイナリバッファを文字列に変更しようとします。文字列はNETではUnicodeであるため、2バイトが必要です。ご覧のとおり、結果は少し予測できません。

BinaryReaderとそのReadBytesメソッドを使用するだけです

using(FileStream fs = new FileStream(@"C:\file", FileMode.Open, FileAccess.Read))
{
    using (var reader = new BinaryReader(fs, new ASCIIEncoding()))
    {
        byte[] buffer = new byte[10];
        buffer = reader.ReadBytes(10);
        if(buffer[0] == 31 && buffer[1] == 139 && buffer[2] == 8)
            // you have a signature match....
    }
}
于 2013-02-10T12:36:33.733 に答える
6

使用法 (pdf ファイルの場合):

Assert.AreEqual("25504446", GetMagicNumbers(filePath, 4));

メソッド GetMagicNumbers:

private static string GetMagicNumbers(string filepath, int bytesCount)
{
    // https://en.wikipedia.org/wiki/List_of_file_signatures

    byte[] buffer;
    using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
    using (var reader = new BinaryReader(fs))
        buffer = reader.ReadBytes(bytesCount);

    var hex = BitConverter.ToString(buffer);
    return hex.Replace("-", String.Empty).ToLower();
}
于 2015-10-14T12:28:58.787 に答える
2

できません。StreamReaderバイナリではなくテキストを読むように作られています。Streamを直接使用して、バイトを読み取ります。あなたの場合FileStream

ファイルがテキストかバイナリかを推測するには、最初の 4K を に読み込んbyte[]で解釈できます。

ところで、文字をバイトに強制しようとしました。これは原則として無効です。an が何であるかを理解することをお勧めしますEncoding。これは、意味的に正しい方法で文字とバイトを変換する唯一の方法です。

于 2013-02-10T12:27:47.453 に答える