为了账号安全,请及时绑定邮箱和手机立即绑定

两字节字符的文件查找

两字节字符的文件查找

Go
ITMISS 2021-04-08 17:15:03
我正在编写小型日志解析器,该解析器应该在文件中找到一些标签。文件很大(512mb),具有以下结构:[2018.07.10 00:30:03:125] VersionInfo\886...some data...[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingTime\16...some data...[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingData\397...some data...[2018.07.10 00:30:03:749][TraceID: 8HRWSI105YVO91]->OutgoingData\26651...somedata...每个块IncomingTime, IncomingData, OutgoingData, etc.的末尾都有块大小(字符数,而不是字节数)886, 16, 397, 26651。有些块非常大,没有大缓冲区就无法读取(如果我使用bufio)。我想使用跳过不必要的块file.Seek。问题是,file.Seek需要字节长度,并且我只有字符计数(块可能具有带两字节字符的unicode数据)。有机会跳过使用字符计数的块吗?
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

问题是文件.Seek需要字节长度,而我只有字符计数(块可能具有带两个字节字符的unicode数据)。有机会跳过使用字符计数的块吗?


这实际上是不可能的。正如您描述的文件格式,以下两种情况都是可能的:


...VersionInfo\1

[ 20 ]

...VersionInfo\1

[ C2 A0 ]

如果您刚刚读过换行符,并且知道需要读取一个字符,那么您知道它在1到2个字节之间(UTF-8字符甚至可以增加到4个字节),但不是一个,然后盲目地启动一些数字字节数而不检查中间数据将不起作用。病理情况是一个较大的块,其中前半部分包含许多多字节字符,后半部分具有恰好看起来像您的输入标头之一的文本。


使用这种文件格式,您不得不一次读取一个字符。


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信