1

当涉及到二进制文件时,我完全不在意。我需要读取一个二进制文件并使用新行作为分隔符将其分成块。我试过用谷歌搜索,但它是空的。对此的任何帮助将不胜感激。它必须作为二进制文件打开。

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

4

4 回答 4

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();
于 2013-07-19T20:25:15.167 回答
1

流本质上是面向字节的。您可以一次将一个字节读入缓冲区,直到您遇到换行符,然后再创建一个新的缓冲区来读入。

于 2013-07-19T20:21:13.223 回答
1

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

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

byte singleByte = 1; //this value will be read from stream
if (singleByte == (byte) '\n')
{
    //your code goes here
}
于 2013-07-19T20:25:19.213 回答
1

首先,如果您的文件中有混合的二进制和文本数据,而您不知道如何解压它,那么您就有麻烦了。

其次,“换行符”到底是什么意思?这些换行符是专门写入二进制文件的0x10吗?或者您是否使用了一些具有类似方法的 .Net 接口WriteLine?或者也许你在这个文件中写了一些包含换行符的文本?在那种情况下,使用了什么编码?

如果您正在手写这些换行符,0x10那么您应该能够毫不费力地弄清楚如何将二进制流拆分为单个字节。

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

现在,如果您正在编写具有特定编码的字符串,这意味着换行符实际上是0x10or 0x00010or0x00000010并且Environment.NewLineis 0x1310or so 您应该改为拆分这些值。哦,字节序会翻转所有这些......0x001300100x0000001300000010

于 2013-07-19T20:25:27.977 回答