Potresti anche considerare di cercare l'argomento di "ber tlv"
link
Questo è il formato del flusso di dati utilizzato dalla rete di elaborazione finanziaria mondiale ed è la spina dorsale di Chip & Terminali pin, bancomat e molti altri sistemi bancari.
La parte migliore è che è molto semplice da usare.
La parte T, L, V sta per
Il tag è un identificatore numerico che specifica il tipo di messaggio, nel tuo caso se utilizzi semplicemente il formato, puoi molto probabilmente definire i tuoi tag per questo, ma se tu dovessi effettivamente gestendo dati finanziari reali dovresti usare i numeri di tag definiti nello standard.
La parte Lunghezza è di nuovo semplice, specifica quanti byte di dati ha la parte valore, come qualsiasi valore, maggiore è il numero di byte che si allocano alla lunghezza, maggiore sarà il carico utile.
La parte Valore è quindi solo il payload del tuo messaggio effettivo e il modo in cui i byte vengono formattati per questo dipende interamente da te.
Beacuse è un protocollo di codifica / codifica così semplice (puoi farlo interamente usando gli array di byte) puoi facilmente inviarlo su UDP usando una dimensione di pacchetto molto piccola e molto veloce.
È anche adatto per lo streaming e più messaggi possono essere inviati indietro in una connessione continua non di chiusura, il che è ideale se decidi di utilizzare TCP.
In teoria funzionerebbe bene anche su HTTP usando un socket web, ma non l'ho mai provato, quindi non ho potuto commentare quanto bene.
Per quanto riguarda le librerie che lo supportano, l'ultima volta ho guardato "Craig's Utility Library"
link
aveva un ottimo supporto per le strutture basate su TLV, così come molte delle librerie di smart card che sono in giro (TLV è usato anche su molte schede)
Se TLV non è il tuo genere, allora definirò sicuramente ciò che gli altri hanno detto e daremo un'occhiata da vicino a "Protobuf"
Aggiornamento
Non so in che lingua stai lavorando, o anche se quello che sto per pubblicare ti sarà di qualche utilità :-), ma qui va comunque.
Questo è un decodificatore TLV (Notare che non ha capacità di codifica, ma dovrebbe essere facile invertirlo) Ho scritto nel 2008 (ish) usando C #, è stato progettato per decodificare pacchetti tlv che escono da una smart card in un terminale di pagamento, ma potrebbero servire come punto di partenza per trasformarlo in una forma più utile.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Card_Analyzer
{
public class tlv
{
public int tag = 0;
public int length = 0;
public byte tagClass = 0;
public byte constructed = 0;
public List<byte> data = new List<byte>();
}
public class tlvparser
{
// List of found TLV structures
public List<tlv> tlvList = new List<tlv>();
// Constructor
public tlvparser(byte[] data)
{
if (data != null)
{
this.doParse(data);
}
}
// Main parsing function
public void doParse(byte[] data)
{
int fulltag = 0;
int tlvlen = 0;
int dptr = 0;
while (dptr < data.Length)
{
byte temp = data[dptr];
int iclass = temp & 0xC0;
int dobj = temp & 0x20;
int tag = temp & 0x1F;
if (tag >= 31) // Using extracted vars, decide if tag is a 2 byte tag
{
fulltag = (temp << 8) + data[dptr + 1];
tlvlen = data[dptr + 2];
dptr += 3;
}
else
{
fulltag = temp;
tlvlen = data[dptr + 1];
dptr += 2;
}// End if tag 16 bit
if ((tlvlen & 128) == 128)
{
tlvlen = (tlvlen << 8) + data[dptr];
dptr++;
}
tlv myTlv = new tlv();
myTlv.tag = fulltag;
myTlv.length = tlvlen;
myTlv.tagClass = Convert.ToByte(iclass >> 6);
myTlv.constructed = Convert.ToByte(dobj >> 5);
for (int i = 0; i < tlvlen; i++)
{
if(dptr < data.Length)
myTlv.data.Add(data[dptr++]);
}
if (myTlv.constructed == 1)
this.doParse(myTlv.data.ToArray());
tlvList.Add(myTlv);
}// End main while loop
}// End constructor
}// end class tlvparser
}// end namespace
Se non serve, sentiti libero di ignorarlo.