读取二进制文件并使用新行作为分隔符来创建二进制块

时间:2013-07-19 20:18:12

标签: c#

当谈到二进制文件时,我完全不在我的元素中。我需要读取一个二进制文件,并使用新行作为分隔符将其分解为块。我试过谷歌搜索它,但它是空的。任何有关这方面的帮助将不胜感激。它必须作为二进制文件打开。

所以我有一个未知编码的文件。我需要使用\n换行符作为我的分隔符,以块的形式分解文件。我正在寻找一个能够以新行作为分隔符来分解这个二进制数据的函数。

4 个答案:

答案 0 :(得分:4)

助手方法

class MyEnumerableExtensions
{
    //For a source containing N delimiters, returns exactly N+1 lists
    public static IEnumerable<List<T>> SplitOn(
        this IEnumerable<T> source,
        T delimiter)
    {
        var list = new List<T>();
        foreach (var item in source)
        {
            if (delimiter.Equals(item))
            {
                yield return list;
                list = new List<T>();
            }
            else
            {
                list.Add(item);
            }
        }
        yield return list;
    }
}

用法

  

我需要读取一个二进制文件并使用换行作为分隔符将其分成块。

var path = "binary-file.bin";
var delimiter = (byte)'\n';
var chunks = File.ReadAllBytes(path)
    .SplitOn(delimiter)
    .ToList();

答案 1 :(得分:1)

Streams本质上是面向字节的。您可以一次读取一个字节到缓冲区,直到您触及换行符,然后创建一个新的缓冲区来读取。

答案 2 :(得分:1)

首先,您必须验证新行的含义 - 可能是:\ n,\ n \ r或\ r \ n。 当你确定你的换行​​概念时,你应该读取二进制文件字节并检查字节序列是否包含我上面提到的字符的字节等价。

例如,如果您有单字节,可以按如下方式检查:

byte singleByte = 1; //this value will be read from stream
if (singleByte == (byte) '\n')
{
    //your code goes here
}

答案 3 :(得分:1)

首先,如果您的文件中存在混合的二进制和文本数据,并且您不知道如何解压缩它,则您遇到了麻烦。

其次,'换行'究竟是什么意思?这些新行是否专门写入二进制文件0x10?或者您使用的是一些类似WriteLine的方法的.Net接口吗?或者你可能在这个包含换行符的文件中写了一些文字?在那种情况下使用了什么编码?

如果您将这些换行符手写为0x10,您应该能够弄清楚如何在单个字节上拆分二进制流而不会有太多困难。

如果您使用WriteLine或类似内容,则表示它实际上只是Environment.NewLine而不是0x10。在Windows计算机上的大多数情况下,这意味着您正在寻找0x1310。如果你不修剪前面的0x13,你将在每个段的末尾有一个额外的垃圾字节。

现在,如果您正在编写具有特定编码的字符串,则意味着换行符实际为0x100x000100x00000010Environment.NewLine0x1310或{ {1}}或0x00130010因此您应该拆分这些值。哦和endian-ness会翻转所有这些......