modo migliore per esportare dati binari con attributi di testo aggiuntivi in un flusso

0

Vorrei creare un'API della riga di comando in un'applicazione Java per esportare un blob binario su stdout. Vorrei inoltre esportare determinati attributi sul blob, idealmente in un formato non binario. L'obiettivo è di produrre questi dati in modo conveniente ed efficiente per scrivere e leggere. Sono abbastanza impostato sull'utilizzo di stdout perché mi consente di inserire facilmente i dati in un altro processo senza creare file intermedi, il che è molto utile.

Potrei scrivere gli attributi del testo su una linea separata da tabulazioni e seguirli con il blob binario. Ma dal momento che lo stdout non è strutturato, sarebbe strano analizzare se il testo e i dati binari sono mescolati. Ad esempio, lo stream dovrebbe probabilmente essere letto in modalità binaria finché non viene trovato un byte che eguaglia un carattere di nuova riga ASCII e quindi i dati dovrebbero essere suddivisi in quel punto.

In alternativa, potrei avvolgere tutti i dati in un formato strutturato. I formati con cui ho più familiarità, come JSON e XML, sono formati di testo e quindi i dati binari dovrebbero essere codificati, il che aumenterebbe notevolmente il tempo di calcolo e la dimensione dei dati. Ma ci possono essere formati progettati per questo scopo.

In terzo luogo, potrei implementare un formato binario simile ai formati di file comuni con un'intestazione contenente campi che hanno una lunghezza di byte fissa o sono preceduti da lunghezze di byte. Tuttavia, sono preoccupato che tale formato sarebbe inutilmente non standardizzato e fastidioso da scrivere e analizzare. In particolare, non vedo il vantaggio di un tale formato rispetto alla prima opzione in cui una nuova riga separa attributi e dati.

Potrebbero esserci anche altre opzioni, ma non sto pensando ad altre buone. Gradirei molto i suggerimenti degli altri su questo argomento.

    
posta Solomonoff's Secret 12.02.2015 - 21:59
fonte

1 risposta

2

Se hai solo bisogno di una soluzione semplice e puoi tollerare byte non ASCII nella regione dell'intestazione, usa solo i buffer del protocollo.

Link ai buffer del protocollo

È sicuro usare JSON per l'intestazione leggibile del tuo file, seguita dal blob binario grezzo senza codifica o incapsulamento, con le seguenti precondizioni:

Link alle specifiche JSON

  • Il tuo JSON deve essere un oggetto al livello più alto.

    • Ciò significa che l'intera intestazione leggibile dall'uomo sarà delimitata da una parentesi graffa di apertura e una parentesi graffa di chiusura.
    • Tutto il resto è tra virgolette, escape e bilanciate.
  • Devi essere specifico sulle novità.

    • Le newline che si verificano all'interno dello stream JSON possono essere gestite liberamente.
    • Tuttavia, devi essere severo riguardo al fatto che una nuova riga (o qualsiasi altro carattere o sequenza di byte) possa verificarsi tra
      • La fine dello stream JSON e
      • L'inizio del blob binario .
    • Ricorda che la nuova riga ha rappresentazioni diverse su diversi SO.
    • Inoltre, sii esplicito sulla gestione delle occorrenze consecutive di newline. Ciò potrebbe derivare da errori di programmazione comuni che non ti lascia altra scelta che tollerarla e aggirarla.
  • La prima fase di analisi deve essere eseguita da un lettore JSON che rilevi la fine dell'oggetto di livello superiore e ignori il resto dei dati binari non crittografati, come spiegato sopra.
    • Questo parser di primo livello non ha bisogno di gestire i metadati; ha solo bisogno di identificare correttamente la fine dell'intestazione.
    • Una volta che l'intestazione è stata separata, può essere passata in un secondo lettore JSON che carica i metadati in oggetti.

Se sei preoccupato della necessità che il software estragga il blob binario senza dover fare affidamento su un ricercatore JSON correttamente implementato, puoi provare questo semplice trucco:

Stabilisci il requisito che il primo valore di campo dell'oggetto JSON di primo livello sia un numero decimale che è il numero di byte del blob binario.

Il tuo lettore non compatibile con JSON può quindi delimitare rapidamente il blob binario come segue:

  • Apri lo stream in modalità binaria.
  • Elimina tutti i byte non compresi nell'intervallo ASCII delle cifre decimali, '0' - '9' , fino a trovare la prima cifra decimale.
  • Analizza la cifra decimale fino a quando non viene trovata una cifra.
  • Cerca la fine del file, quindi ricalcola lo scostamento iniziale del blob binario sottraendo la sua lunghezza prevista (rilevata sopra) dalla sua posizione finale.

Se hai bisogno che l'intera trasmissione sia sequenzialmente parsabile (eseguibile in streaming), puoi farlo invece:

  • Codifica i metadati in JSON in un flusso di memoria .
    • Non scrivere ancora sull'output; che saranno diversi in seguito.
    • Sii specifico sulla codifica di output.
    • Dal prossimo passo avanti, lo tratteremo come un flusso di byte, il che significa che non può essere "modificato" dopo questo passaggio.
  • Ottieni il numero di byte del flusso di byte JSON codificato.
  • Trasmetti questo conteggio dei byte come numero decimale codificato ASCII, seguito da una nuova riga.
    • Come menzionato sopra, sii esplicito su cosa significa "newline".
  • Trasmette il flusso di byte JSON codificato (dal flusso di memoria), esattamente così com'è.
    • Il numero di byte trasmessi deve corrispondere al numero decimale codificato ASCII.
  • Trasmetti il resto del blob binario.

Come una leggera modifica, puoi probabilmente trasmettere la lunghezza del flusso di byte di entrambi il flusso JSON e il blob binario.

    
risposta data 15.03.2015 - 04:14
fonte

Leggi altre domande sui tag