52

I want to make a method that takes any file and reads it as an array of 0s and 1s, i.e. its binary code. I want to save that binary code as a text file. Can you help me? Thanks.

3
  • 1
    Your question is unclear. What exactly should the two files look like? Commented Mar 11, 2010 at 15:29
  • 1
    I think he wants to store the bit pattern of a file into a text file. Commented Mar 11, 2010 at 15:32
  • 1
    Is the source file binary or encoded (textual, either as ASCII, UTF-8, UTF-16, etc)? In other words, if you open the file in a text editor like Notepad, do you see zeros and ones? Commented Mar 11, 2010 at 15:55

5 Answers 5

73

Quick and dirty version:

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());
Sign up to request clarification or add additional context in comments.

1 Comment

@Andrey: See "quick and dirty". Obviously, in production, something using file streams would be much better. The important part is converting from bytes to binary strings.
24

Well, reading it isn't hard, just use FileStream to read a byte[]. Converting it to text isn't really generally possible or meaningful unless you convert the 1's and 0's to hex. That's easy to do with the BitConverter.ToString(byte[]) overload. You'd generally want to dump 16 or 32 bytes in each line. You could use Encoding.ASCII.GetString() to try to convert the bytes to characters. A sample program that does this:

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();
    }
}

3 Comments

Thank you for your answer. Hmmm.. something doesn't seem to work, as I'm not getting the 0s and 1s. Instead, I am getting the same effect as if I would chose to open a file in notepad.
Yes you do, they are encoded in hex. Not the same thing you'd see in notepad. Backgrounder: en.wikipedia.org/wiki/Hexadecimal
This method reads the file, can you provide a method that writes the binary to the file or writes the binary data to the file then converts to hex to read back the way you have it here?
8

You can use BinaryReader to read each of the bytes, then use BitConverter.ToString(byte[]) to find out how each is represented in binary.

You can then use this representation and write it to a file.

Comments

8
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;  

Comments

5

Use simple FileStream.Read then print it with Convert.ToString(b, 2)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.