从c#中的任何类型的文件读取二进制文件

时间:2013-11-19 21:59:03

标签: c# file binary

我需要从不同类型的文件(wav,dll等)中读取数据以获得压缩算法。现在算法有点整理了,但是我从非文本文件中读取时遇到了问题。 我需要做的是读取文件中每个字符的ascii表示,然后将我的算法应用到我读过的内容中。

我用它来读取(path是表示文件路径的字符串,byte [] abc):

if (path != "") {
abc = File.ReadAllBytes(path);
}

它适用于文本文件(doc,txt,.m等)但如果我尝试为dll文件执行此操作,则会出现以下错误:对于无符号字节,值太大或太小。 我也尝试将abc设置为字符串并使用File.ReadAllText然后将字符串中的每个字符转换为字节值但我得到相同的错误。 我知道wav文件,例如,如果你在文本编辑器中打开它,由特殊字符组成,到目前为止,我认为其中一些字符的ascii值超过255,可能导致错误。但是我不知道事实是否真的如此,而且我对我可能做的事情有点困惑以解决我的问题。 如果有人有任何想法我会非常感激。如果你能坚持使用的语言(C#)也会很好。 谢谢!

2 个答案:

答案 0 :(得分:0)

字节是0到255之间的值。计算机上的每个文件都包含许多字节,无论它们是波形文件,dll文件,文本文件还是没有扩展名的文件。您可以从任何文件ReadAllBytes和返回的所有字节包含0到255之间的值。

ASCII是一个字符集,包含0到127之间的值 - 有ASCII扩展或代码页,包含256个可能的值。并非所有值都可以表示(或显示) - ASCII的一部分,这些扩展名是没有默认表示的控制字符。

没有超过255的ASCII字符 - 您看到的字符是文本编辑器,试图充分利用它。

您得到的错误是将某些内容(一个字节?)转换为 ubyte ,它允许-128到127之间的值,而大多数wave文件肯定包含127以上的值。

简而言之:您不能使用ASCII来表示字节的每个可能值。您可以使用ASCII扩展来保存字节的值,但对于非文本文件没有意义(在文本编辑器中打开.wav文件时看到的'A'并不意味着'A')。

如果您确实希望继续沿着您选择的路径前进,则必须将代码转换为无符号字节或ASCII值。但您可能应该尝试将您的算法“转换”为二进制算法。

答案 1 :(得分:0)

使用以下代码:

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
   byte[] buffer = new byte[fileStream.Length];
   fileStream.Read(buffer, 0, (int) fileStream.Length);
   return buffer;
}

试图用这段代码读取kernel32.dll和user32.dll,它运行得很好