Best practice per la lettura di flussi di byte dinamici: il confronto linea per linea con una maschera è il modo migliore?

0

Ricevo i dati del sensore come un flusso binario di byte. Questo flusso non è sempre della stessa lunghezza e non include lo stesso set di dati ogni volta. Se il sensore non ha inviato un campo, è semplicemente assente, non null. I primi 62 byte di dati sono sempre prevedibili, ma dopo è tutto in aria. Tuttavia, il messaggio è suddiviso in sezioni, ciascuna con un valore di intestazione che descrive i dati procedurali.

La vecchia implementazione era di leggere l'intestazione e fare un confronto bit a bit con una maschera per indicare se il campo era popolato o meno. Ciò si è verificato per ogni valore che potrebbe essere stato scritto nel flusso dal sensore. Un esempio è il seguente (C #):

    // declare bitmask
    private static int FIELD_SPECIFIC_BITMASK = 0x01;

    public Task Process(BinaryReader reader)
    {
         // read section's header
         int sectionHeader = reader.ReadInt32;

         if((sectionHeader & FIELD_SPECIFIC_BITMASK) !=0)
         {
              reader.ReadByte()
         }
    }

Ci deve essere un modo più efficiente e più pulito di fare questa scrittura? Ci sono dozzine di campi in cinque sezioni, e questo sembra inefficiente, ma non sono stato in grado di trovare una soluzione migliore.

    
posta Nickdb93 23.02.2018 - 22:04
fonte

1 risposta

1

Quando c'è un numero limitato di combinazioni di campi che vengono inviate relativamente spesso, puoi prima fare un cambio sull'intestazione della sezione e saltare alla lettura di una sequenza di campi in pila. Nel ramo predefinito dell'interruttore, ad esempio quando si legge una combinazione di campi relativamente rara, si ritorna al bit testing.

Se il tuo linguaggio di programmazione lo supporta (c # fa tramite System.Runtime.Interop.Marshal), puoi usare I / O mappato memmory invece di un gruppo di operazioni BinaryReader.Read (). Marshal.PtrToStructure può essere più veloce ma limitato a strutture fisse. Devi misurare se è più veloce nella tua situazione. Inoltre le strutture aiutano a documentare il protocollo binario.

    
risposta data 04.03.2018 - 00:58
fonte

Leggi altre domande sui tag