web-dev-qa-db-fra.com

Comment lire un fichier binaire en C #?

Je veux créer une méthode qui prend n'importe quel fichier et le lit comme un tableau de 0 et de 1, c'est-à-dire son code binaire. Je veux enregistrer ce code binaire en tant que fichier texte. Pouvez-vous m'aider? Merci.

28
Boris

Version rapide et sale:

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

Eh bien, la lecture n'est pas difficile, utilisez simplement FileStream pour lire un octet []. Le convertir en texte n'est généralement pas possible ni significatif sauf si vous convertissez les 1 et les 0 en hexadécimal. C'est facile à faire avec la surcharge BitConverter.ToString (byte []). Vous voudriez généralement vider 16 ou 32 octets dans chaque ligne. Vous pouvez utiliser Encoding.ASCII.GetString () pour essayer de convertir les octets en caractères. Un exemple de programme qui fait cela:

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

Vous pouvez utiliser BinaryReader pour lire chacun des octets, puis utiliser BitConverter.ToString (byte []) pour découvrir comment chacun est représenté en binaire.

Vous pouvez ensuite utiliser cette représentation et écrire dans un fichier.

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

Utilisez le simple FileStream.Read Puis imprimez-le avec Convert.ToString(b, 2)

4
Andrey

En général, je ne vois pas vraiment de façon possible de procéder. J'ai épuisé toutes les options que les commentaires précédents vous ont données, et elles ne semblent pas fonctionner. Vous pouvez essayer ceci:

        `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;
        }
    }`
  • C'est le code du bouton "Ouvrir ...", mais voici le code du bouton "Enregistrer ...":

    `private void button2_Click (expéditeur d'objet, 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);
            }
        }
    }`
    
    • Voilà le bouton de sauvegarde. Cela fonctionne bien, mais ne montre que le '! Cela ne peut pas être exécuté en mode DOS!' - Sinon, si tu peux arranger ça, je ne sais pas quoi faire.

    • Mon site

1
MomoroTTV