web-dev-qa-db-ja.com

C#でファイルバイナリを読み取る方法

任意のファイルを受け取り、0と1の配列、つまりバイナリコードとして読み取るメソッドを作成したいと思います。そのバイナリコードをテキストファイルとして保存します。手伝って頂けますか?ありがとう。

28
Boris

クイックでダーティなバージョン:

byte[] fileBytes = File.ReadAllBytes(inputFilename);
StringBuilder sb = new StringBuilder();

foreach(byte b in fileBytes)
{
    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0'));  
}

File.WriteAllText(outputFilename, sb.ToString());
52
Chris Doggett

それを読むのは難しくありません。FileStreamを使用してbyte []を読むだけです。それをテキストに変換することは、1と0を16進数に変換しない限り、実際には一般的に不可能または意味がありません。 BitConverter.ToString(byte [])オーバーロードを使用すると簡単です。通常、各行に16または32バイトをダンプします。 Encoding.ASCII.GetString()を使用して、バイトを文字に変換することができます。これを行うサンプルプログラム:

using System;
using System.IO;
using System.Text;

class Program {
    static void Main(string[] args) {
        // Read the file into <bits>
        var fs = new FileStream(@"c:\temp\test.bin", FileMode.Open);
        var len = (int)fs.Length;
        var bits = new byte[len];
        fs.Read(bits, 0, len);
        // Dump 16 bytes per line
        for (int ix = 0; ix < len; ix += 16) {
            var cnt = Math.Min(16, len - ix);
            var line = new byte[cnt];
            Array.Copy(bits, ix, line, 0, cnt);
            // Write address + hex + ascii
            Console.Write("{0:X6}  ", ix);
            Console.Write(BitConverter.ToString(line));
            Console.Write("  ");
            // Convert non-ascii characters to .
            for (int jx = 0; jx < cnt; ++jx)
                if (line[jx] < 0x20 || line[jx] > 0x7f) line[jx] = (byte)'.';
            Console.WriteLine(Encoding.ASCII.GetString(line));
        }
        Console.ReadLine();
    }
}
16
Hans Passant

BinaryReader を使用して各バイトを読み取り、次に BitConverter.ToString(byte []) を使用して、それぞれがバイナリでどのように表現されるかを調べることができます。

その後、この表現を使用して、ファイルに write を使用できます。

5
Oded
using (FileStream fs = File.OpenRead(binarySourceFile.Path))
    using (BinaryReader reader = new BinaryReader(fs))
    {              
        // Read in all pairs.
        while (reader.BaseStream.Position != reader.BaseStream.Length)
        {
            Item item = new Item();
            item.UniqueId = reader.ReadString();
            item.StringUnique = reader.ReadString();
            result.Add(item);
        }
    }
    return result;  
4
guest

単純な_FileStream.Read_を使用してから、Convert.ToString(b, 2)で印刷します

4
Andrey

一般的に、これを行う方法は実際にはありません。以前のコメントで提供されたすべてのオプションを使い果たしましたが、機能しないようです。これを試すことができます:

        `private void button1_Click(object sender, EventArgs e)
    {
        Stream myStream = null;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.InitialDirectory = "This PC\\Documents";
        openFileDialog1.Filter = "All Files (*.*)|*.*";
        openFileDialog1.FilterIndex = 1;
        openFileDialog1.RestoreDirectory = true;
        openFileDialog1.Title = "Open a file with code";

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string exeCode = string.Empty;
            using (BinaryReader br = new BinaryReader(File.OpenRead(openFileDialog1.FileName))) //Sets a new integer to the BinaryReader
            {
                br.BaseStream.Seek(0x4D, SeekOrigin.Begin); //The seek is starting from 0x4D
                exeCode = Encoding.UTF8.GetString(br.ReadBytes(1000000000)); //Reads as many bytes as it can from the beginning of the .exe file
            }
            using (BinaryReader br = new BinaryReader(File.OpenRead(openFileDialog1.FileName)))
                br.Close(); //Closes the BinaryReader. Without it, opening the file with any other command will result the error "This file is being used by another process".

            richTextBox1.Text = exeCode;
        }
    }`
  • これは「開く...」ボタンのコードですが、「保存...」ボタンのコードは次のとおりです。

    `private void button2_Click(object sender、EventArgs e){SaveFileDialog save = new SaveFileDialog();

        save.Filter = "All Files (*.*)|*.*";
        save.Title = "Save Your Changes";
        save.InitialDirectory = "This PC\\Documents";
        save.FilterIndex = 1;
    
        if (save.ShowDialog() == DialogResult.OK)
        {
    
            using (BinaryWriter bw = new BinaryWriter(File.OpenWrite(save.FileName))) //Sets a new integer to the BinaryReader
            {
                bw.BaseStream.Seek(0x4D, SeekOrigin.Begin); //The seek is starting from 0x4D
                bw.Write(richTextBox1.Text);
            }
        }
    }`
    
    • それが保存ボタンです。これは正常に機能しますが、「!これはDOSモードでは実行できません!」 -それ以外の場合、これを修正できれば、私は何をすべきかわかりません。

    • 個人用サイト

1
MomoroTTV