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.
- 1Your question is unclear. What exactly should the two files look like?SLaks– SLaks2010-03-11 15:29:42 +00:00Commented Mar 11, 2010 at 15:29
- 1I think he wants to store the bit pattern of a file into a text file.Oded– Oded2010-03-11 15:32:30 +00:00Commented Mar 11, 2010 at 15:32
- 1Is 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?Pat– Pat2010-03-11 15:55:01 +00:00Commented Mar 11, 2010 at 15:55
5 Answers
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()); 1 Comment
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
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
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;