我正在尝试读取文件(> 150 mb),我需要读取该文件的二进制表示。
文件类型为.MP4
。
我正在尝试使用它:
string.Join("-", x.Select(byt => Convert.ToString(byt, 2).PadLeft(8, '0')));
但问题是:
1)太慢了 2)它使用了大量的RAM内存
如果我用
读取原始字节File.ReadAllBytes(path);
如何在不将文件转换为字符串的情况下执行此操作(下面的方法)?
答案 0 :(得分:3)
在使用像你的情况一样的大文件时,最好只查看文件的一小部分(不管你是否可以一次显示整个文件)。
某些Streams
(与FileStream
一样)可以Seek
某个位置,您可以使用它来设置起始位置。
if(position > _stream.Length)
throw new IndexOutOfRangeException();
if (position + length > _stream.Length)
length = (int) (_stream.Length - position);
_stream.Seek(position, SeekOrigin.Begin);
_stream.Read(buffer, 0, length);
转换为二进制不是硬件,取决于您想要的位顺序,您可能必须将其反转(这是最高位1 = 00000001
)。要在构建字符串时获得一些性能,请使用StringBuilder
而不是仅使用+=
或+
来结束字符串。
public string ToBinary(byte value)
{
string result = "";
for (int i = 0; i < 8; i++)
{
result = value%2 + result;
value /= 2;
}
return result;
}
private string ToBinary(byte[] values)
{
StringBuilder builder = new StringBuilder();
int column = 0;
foreach (byte value in values)
{
builder.Append(ToBinary(value) + " ");
column++;
if (column == 8)
{
builder.AppendLine();
column = 0;
}
}
return builder.ToString();
}
然后可以在控制台应用程序中使用它
https://dotnetfiddle.net/GVLm27
或将这两者与TextBox和ScrollBar放在一起,你有一个很好的起点:
ong position = (long) scrollBar1.Value;
byte[] data = new byte[128];
_file.GetSection(data, position, data.Length);
textBox1.Text = ToBinary(data);
在对你的问题做出所有评论之后,我希望原来的标题仍然是你的目标
C#读取数据二进制表示的最快方法