如何在C#中以二进制形式读取文件?

50

我想编写一个方法,可以将任何文件读取为0和1的数组,即二进制代码。我想将该二进制代码保存为文本文件。你能帮我吗?谢谢。


1
你的问题不够清晰。这两个文件应该长什么样子? - SLaks
1
我认为他想将文件的位模式存储到文本文件中。 - Oded
1
源文件是二进制的还是编码的(文本形式,如ASCII、UTF-8、UTF-16等)?换句话说,如果你在像记事本这样的文本编辑器中打开文件,你会看到0和1吗? - Pat
5个回答

71

快速简单版:

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

3
@Andrey: 请看“快速而粗略”。显然,在生产环境中,使用文件流会更好。重要的部分是将字节转换为二进制字符串。 - Chris Doggett

24

读取二进制数据并不难,只需要使用FileStream来读取一个byte[]。将其转换为文本通常是没有意义的,除非你将1和0转换为十六进制。这可以使用BitConverter.ToString(byte[])重载很容易完成。一般情况下,你会想每行输出16或32个字节。你可以使用Encoding.ASCII.GetString()尝试将字节转换为字符。以下是一个执行此操作的示例程序:

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

1
谢谢你的回答。嗯...似乎有些问题,因为我没有得到0和1。相反,我得到了与在记事本中打开文件相同的效果。 - Boris
1
是的,它们以十六进制编码。这不是你在记事本中看到的东西。背景知识:http://en.wikipedia.org/wiki/Hexadecimal - Hans Passant
1
这个方法读取文件,你能提供一个写入二进制到文件或者将二进制数据写入文件并转换为十六进制以便像你在这里读取一样吗? - shawn

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

7

5

使用简单的 FileStream.Read 方法读取数据,然后使用 Convert.ToString(b, 2) 方法将其转换为二进制并打印出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接