我正在尝试解析 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/