读取二进制文件并使用新行作为分隔符来创建二进制块
本文关键字:分隔符 创建 二进制 新行作 二进制文件 读取 | 更新日期: 2023-09-27 18:23:55
当涉及到二进制文件时,我完全脱离了我的元素。我需要读取一个二进制文件,并使用新行作为分隔符将其分成块。我试过在谷歌上搜索这个,但结果是空的。如有任何帮助,我们将不胜感激。它必须作为二进制文件打开。
所以我有一个未知编码的文件。我需要使用'n
换行符作为分隔符,按块对文件进行分隔。我正在寻找一个函数,可以打破这个二进制数据与新行作为分隔符。
Helper方法
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();
首先,如果文件中混合了二进制和文本数据,而您不知道如何解包,那么您就有麻烦了。
其次,你所说的"换行符"到底是什么意思?这些换行符是专门作为0x10
写入二进制文件的吗?或者你使用的是一些.Net接口,上面有一个类似WriteLine
的方法?或者你在这个文件中写了一些包含换行符的文本?在这种情况下,使用了什么编码?
如果您将这些换行符手写为0x10
,那么您应该能够在不太困难的情况下找出如何在单个字节上拆分二进制流。
如果您使用了WriteLine
或类似的内容,那就意味着它实际上写的是Environment.NewLine
,而不仅仅是0x10
。在大多数情况下,在windows计算机上,这意味着您正在查找0x1310
。如果不从前面修剪0x13
,则在每个段的末尾都会有一个额外的垃圾字节。
现在,如果您正在编写具有特定编码的字符串,这意味着换行符实际上是0x10
、0x00010
或0x00000010
,而Environment.NewLine
是0x1310
、0x00130010
或0x0000001300000010
,因此您应该对这些值进行拆分。哦和endian ness会翻转所有这些。。。
流本质上是面向字节的。您可以一次将一个字节读取到缓冲区中,直到遇到换行符,然后创建一个新的缓冲区进行读取。
首先,您必须验证新行的含义-它可能是:''n、''n''r或''r''n。当您确定了换行符的概念时,您应该读取二进制文件字节,并检查字节序列是否包含我上面提到的字符的字节等价物。
例如,如果您有单个字节,您可以按如下方式检查:
byte singleByte = 1; //this value will be read from stream
if (singleByte == (byte) ''n')
{
//your code goes here
}