C# - 从文件中读取特定字符串的字节

标签 c# file filestream binaryfiles

我正在尝试解析 crg-file在 C# 中。该文件混合有纯文本和二进制数据。文件的第一部分包含纯文本,而文件的其余部分是二进制的(大量 float ),下面是一个示例:

$
$ROAD_CRG
reference_line_start_u   =  100
reference_line_end_u     =  120
$
$KD_DEFINITION
#:KRBI
U:reference line u,m,730.000,0.010
D:reference line phi,rad
D:long section 1,m
D:long section 2,m
D:long section 3,m
...
$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
�@z����RA����\�l
...

我知道我可以读取从特定偏移量开始的字节,但如何找出从哪个字节开始?二进制部分之前的最后一行将始终包含至少四个美元符号“$$$$”。这是我到目前为止所得到的:

using var fs = new FileStream(@"crg_sample.crg", FileMode.Open, FileAccess.Read);

var startByte = ??; // How to find out where to start?

using (BinaryReader reader = new BinaryReader(fs))
{
    reader.BaseStream.Seek(startByte, SeekOrigin.Begin);
    var f = reader.ReadSingle();
    Debug.WriteLine(f);
}

最佳答案

当您混合使用文本数据和二进制数据时,您需要将所有内容都视为二进制数据。这意味着您应该使用原始 Stream 访问权限或类似的方式,并使用二进制 API 来查看文本数据(通常在 bytes 处查找 cr/lf/crlf 作为哨兵,尽管在您的情况下听起来您可以只使用二进制 API 查找 $$$$,然后解码整个 block ,然后向前扫描)。当您认为您有一整行时,您可以使用 Encoding 来解析每一行 - 最方便的 API 是 encoding.GetString()。 当您完成查找后通过文本数据作为二进制然后您可以继续解析二进制数据,再次使用二进制API。我通常也会在这里推荐不要使用 BinaryReader,因为坦率地说,与更直接的 API 相比,它并没有给你带来太多好处。您可能需要考虑的其他问题是CPU字节顺序,但假设这不是问题:BitConverter.ToSingle()可能是您的 friend 。

如果数据大小适中,您可能会发现使用 byte[] 来存储数据是最简单的;通过 File.ReadAllBytes,或者从数组池中租用一个超大的 byte[],然后从 FileStream 加载它。 Stream API 对于这种情况来说很尴尬,因为一旦你查看了数据:它就消失了 - 所以你需要维护自己的后台缓冲区。在处理大数据时,管道 API 非常适合此目的,但它是一个高级主题。

关于C# - 从文件中读取特定字符串的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59826183/

相关文章:

c# - 在这种情况下 new() 是什么意思?

c# - ILMerge:如何合并Azure运行时库?

c# - 如何在后台 worker 中调用这个方法?

java - 之前的文件删除过程

C++ 打开文件流

c# - 如何在 Xamarin 中测试共享代码

python - 如何用不同的名称保存文件而不覆盖现有文件

python - 从 open() 创建列表时关闭文件

android - 覆盖现有数据库

c# - 读取时是否需要 Flush() FileStream?