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.
Thank you for your answer.
Boris
2010-03-11 16:19:53
+4
A:
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();
}
}
Hans Passant
2010-03-11 15:33:50
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.
Boris
2010-03-11 16:18:43
Yes you do, they are encoded in hex. Not the same thing you'd see in notepad. Backgrounder: http://en.wikipedia.org/wiki/Hexadecimal
Hans Passant
2010-03-11 16:28:13
+1
A:
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.
Oded
2010-03-11 15:35:56
+2
A:
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());
Chris Doggett
2010-03-11 15:49:35
@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.
Chris Doggett
2010-03-11 17:42:41
SLaks
2010-03-11 17:42:54