Quiero hacer un método que toma cualquier archivo y lea como una matriz de 0s y 1s, es decir, su código binario. Quiero guardar ese código binario como un archivo de texto. Me pueden ayudar? Gracias.

  • Tu pregunta no es clara. ¿Qué hay de los dos archivos parece?
  • Yo creo que él quiere almacenar el patrón de bits de un archivo en un archivo de texto.
  • Es el archivo de código fuente o binario codificado (textual, ya sea como ASCII, UTF-8, UTF-16, etc)? En otras palabras, si usted abra el archivo en un editor de texto como el Bloc de notas, no ves ceros y unos?
InformationsquelleAutor Boris | 2010-03-11

6 Comentarios

  1. 52

    Rápido y sucio versión:

    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());
    • Ver «rápido y sucio». Obviamente, en la producción, algo utilizando secuencias de archivo sería mucho mejor. La parte importante es la conversión de bytes a cadenas binarias.
  2. 16

    Bien, la lectura no es difícil, sólo el uso de FileStream para leer un byte[]. La conversión de texto no es realmente posible o significativa a menos que se convierta el 1 y 0 hex. Eso es fácil de hacer con la BitConverter.ToString(byte[]) sobrecarga. A usted le quiere volcado de 16 o de 32 bytes en cada línea. Usted podría utilizar la Codificación.ASCII.GetString() para intentar convertir los bytes a caracteres. Un ejemplo de programa que hace esto:

    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();
        }
    }
    • Gracias por tu respuesta. Hmmm.. algo no funciona, como no estoy recibiendo los 0s y 1s. En su lugar, voy a obtener el mismo efecto como si yo hubiera escogido para abrir un archivo en el bloc de notas.
    • Sí lo haces, que están codificados en formato hexadecimal. No es lo mismo que se podía ver en el bloc de notas. Antecedentes: en.wikipedia.org/wiki/Hexadecimal
    • Este método lee el archivo, puede proporcionar un método que escribe el binario para el archivo o escribe los datos binarios en el archivo, a continuación, convierte a hexadecimal a leer de nuevo a la forma en que tienes aquí?
  3. 4
    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. 1

    Por lo general, yo no veo una posible forma de hacerlo. He agotado todas las opciones que los anteriores comentarios te dio, y que no parecen funcionar. Usted podría intentar esto:

            `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;
            }
        }`
    • Que es el código para el «Open…» botón, pero aquí está el código para el «Guardar…» botón:

      ` private void button2_Click(object sender, EventArgs e)
      {
      SaveFileDialog guardar = 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);
              }
          }
      }`
      • Que el botón guardar. Esto funciona bien, pero solo muestra el ‘!Esto no se puede ejecutar en el Modo DOS!’ – De lo contrario, si usted puede arreglar esto, no sé qué hacer.

      • Mi Sitio

Dejar respuesta

Please enter your comment!
Please enter your name here