@@ -20,7 +20,7 @@ public class EncodingHandler {
2020 private readonly FullEKey [ ] EKeyESpecHeaderKeys ;
2121 private readonly EKeyESpecEntry [ ] [ ] EKeyESpecPages ;
2222
23- //public readonly string [] ESpecs ;
23+ private readonly byte [ ] ESpecBlock ;
2424
2525 public EncodingHandler ( ClientHandler client ) : this ( client ,
2626 client . ConfigHandler . BuildConfig . Encoding . EncodingKey , client . ConfigHandler . BuildConfig . EncodingSize ! . EncodedSize )
@@ -46,18 +46,12 @@ public EncodingHandler(Stream? stream, bool leaveOpen=false)
4646 header . Version != 1 ) {
4747 throw new InvalidDataException ( $ "EncodingHandler: encoding header invalid (magic: { header . Signature : X4} , csize: { header . CKeySize } , esize: { header . EKeySize } )") ;
4848 }
49-
50- var cKeyEKeyPageSize = header . m_ckeyEKeyPageSize . ToInt ( ) ;
51- var eKeyESpecPageSize = header . m_eKeyESpecPageSize . ToInt ( ) ;
52-
53- var cKeyEKeyPageCount = header . m_cKeyEKeyPageCount . ToInt ( ) ;
54- var eKeyEspecPageCount = header . m_eKeyEspecPageCount . ToInt ( ) ;
55-
5649 Debug . Assert ( header . m_unknown == 0 ) ; // asserted by agent
5750
58- //ESpecs = Encoding.ASCII.GetString(reader.ReadBytes((int)header.m_especBlockSize.ToInt())).Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
59- stream . Position += header . m_especBlockSize . ToInt ( ) ;
51+ ESpecBlock = reader . ReadBytes ( ( int ) header . m_especBlockSize . ToInt ( ) ) ;
6052
53+ var cKeyEKeyPageSize = header . m_ckeyEKeyPageSize . ToInt ( ) ;
54+ var cKeyEKeyPageCount = header . m_cKeyEKeyPageCount . ToInt ( ) ;
6155 var cKeyEKeyHeaders = reader . ReadArray < PageHeader > ( ( int ) cKeyEKeyPageCount ) ;
6256 CKeyEKeyHeaderKeys = cKeyEKeyHeaders . Select ( x => x . FirstKey ) . ToArray ( ) ;
6357 CKeyEKeyPages_CKeys = new LinearCKeyEntry [ cKeyEKeyHeaders . Length ] [ ] ;
@@ -95,7 +89,9 @@ public EncodingHandler(Stream? stream, bool leaveOpen=false)
9589
9690 CKeyEKeyPages_CKeys [ pageIdx ] = CKeyEKeyPages_CKeys [ pageIdx ] . AsSpan ( 0 , entryIdx ) . ToArray ( ) ;
9791 }
98-
92+
93+ var eKeyESpecPageSize = header . m_eKeyESpecPageSize . ToInt ( ) ;
94+ var eKeyEspecPageCount = header . m_eKeyEspecPageCount . ToInt ( ) ;
9995 var eKeyESpecHeaders = reader . ReadArray < PageHeader > ( ( int ) eKeyEspecPageCount ) ;
10096 EKeyESpecHeaderKeys = eKeyESpecHeaders . Select ( x => x . FirstKey ) . ToArray ( ) ;
10197 EKeyESpecPages = new EKeyESpecEntry [ eKeyESpecHeaders . Length ] [ ] ;
@@ -200,6 +196,22 @@ public IEnumerable<CKey> GetCKeys() {
200196 }
201197 }
202198
199+ public IEnumerable < string > GetESpecs ( ) {
200+ var pos = 0 ;
201+ while ( pos < ESpecBlock . Length ) {
202+ var span = ESpecBlock . AsSpan ( pos ) ;
203+ var terminatorIdx = span . IndexOf ( ( byte ) 0 ) ;
204+ Debug . Assert ( terminatorIdx != - 1 ) ;
205+ Debug . Assert ( terminatorIdx != 0 ) ;
206+
207+ var especAscii = span . Slice ( 0 , terminatorIdx ) ;
208+ var espec = Encoding . ASCII . GetString ( especAscii ) ;
209+ yield return espec ;
210+
211+ pos += terminatorIdx + 1 ;
212+ }
213+ }
214+
203215 [ StructLayout ( LayoutKind . Sequential , Pack = 1 ) ]
204216 private struct Header {
205217 public ushort Signature ; // Encoding signature, "EN"
0 commit comments