读取数据二进制表示的最快方法

时间:2016-05-29 13:49:31

标签: c#

我正在尝试读取文件(> 150 mb),我需要读取该文件的二进制表示。

文件类型为.MP4

我正在尝试使用它:

 string.Join("-", x.Select(byt => Convert.ToString(byt, 2).PadLeft(8, '0')));

但问题是:

1)太慢了 2)它使用了大量的RAM内存

如果我用

读取原始字节
File.ReadAllBytes(path);

如何在不将文件转换为字符串的情况下执行此操作(下面的方法)?

1 个答案:

答案 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);

Binary Viewer Example

在对你的问题做出所有评论之后,我希望原来的标题仍然是你的目标

  

C#读取数据二进制表示的最快方法