P7m codificato

Oggi faccio il pignolo.
Quello che hai scoperto non è necessariamente vero. Dipende da quanto sono lunghi i “blocchi” in cui è spezzato il file XML. Piuttosto che fare a caso, forse è meglio leggere le specifiche (ASN.1 con codifica BER), oppure usare un tool già pronto (tipo openssl).
Comunque, se il file XML è spezzato in blocchi, ogni blocco avrà davanti un header di due o più byte fatto così:

  1. Il primo byte sarà 0x04 (tipo OCTET STRING)
  2. Se la lunghezza del blocco è <=127, il secondo byte contiene la lunghezza del blocco. Se la lunghezza del blocco è >=128, il secondo byte ha il bit più significativo settato e gli altri sette indicano quanti byte successivi vengono usati per specificare la lunghezza.
  3. -n. I byte dal terzo in poi contengono la lunghezza (se >= 128).

Quindi: se un blocco ha lunghezza minore o uguale a 127, il header sarà lungo 2 byte. Se la lunghezza è compresa tra 128 e 255, il header sarà lungo 3 byte. Se la lunghezza è compresa tra 256 e 65535, il header sarà lungo 4 byte. Se la lunghezza è compresa tra 64K e 16M, il header sarà lungo 5 byte, ecc.

Nei file che ho analizzato (ma non è che ho controllato tutte le fatture ricevute) i blocchi avevano lunghezza 1000, quindi con header di 4 byte. In questo caso il tuo algoritmo funziona, ma se la lunghezza fosse per esempio di 8K, il terzo byte del header sarebbe 0x20, ovvero uno spazio, e non lo rileveresti.

1 Mi Piace