From 70d4c9271b685f79c57a24207cc6d5bb987fc23f Mon Sep 17 00:00:00 2001 From: lev Date: Fri, 20 Sep 2024 09:59:02 +0300 Subject: [PATCH] push some changes --- src/Asv.IO/ULog/ULogReader.cs | 40 +++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Asv.IO/ULog/ULogReader.cs b/src/Asv.IO/ULog/ULogReader.cs index 4c9270d..6b93ba9 100644 --- a/src/Asv.IO/ULog/ULogReader.cs +++ b/src/Asv.IO/ULog/ULogReader.cs @@ -95,8 +95,12 @@ public bool TryRead(ref SequenceReader rdr,out IULogToken? token) break; case ReaderState.Corrupted: corrupted: - // TODO: try to find sync message and switch to DataSection - throw new Exception("Corrupted ULog file. Sync message not implemented."); + if (!InternalReadSyncSequence(ref rdr, ref token)) + { + _state = ReaderState.Corrupted; + } + + _state = ReaderState.DataSection; break; default: throw new ArgumentOutOfRangeException(); @@ -105,6 +109,38 @@ public bool TryRead(ref SequenceReader rdr,out IULogToken? token) return true; } + + private bool InternalReadSyncSequence(ref SequenceReader rdr, ref IULogToken? token) + { + token = null; + + var buffer = ArrayPool.Shared.Rent(512); + try + { + var temp = new Span(buffer); + while (true) + { + if (rdr.TryRead(out var data)) // we have an item to handle + { + // возможно стоит искать токен прям здесь, чтобы в случае обнаружения сразу прекратить чтение + BinSerialize.WriteByte(ref temp, data); + rdr.Advance(sizeof(byte)); + } + + // попробовать найти хэдер и токен, если получилось найти, то + // вернуть true и сдвинуть каретку на байт после токена + + // если не получилось найти + rdr.Rewind(sizeof(ushort) + sizeof(byte) + ULogSynchronizationMessageToken.SyncMagic.Length); + } + } + finally + { + ArrayPool.Shared.Return(buffer); + } + + return false; + } private bool InternalReadToken(ref SequenceReader rdr, ref IULogToken? token) {