Come si comprimono le stringhe ASCII in meno byte?

10

Sto lavorando con un dispositivo incorporato con un protocollo univoco che invia messaggi ad altri dispositivi e sto facendo un'applicazione che analizza i pacchetti inviati. Ogni pacchetto ha 8 byte. Il protocollo è definito come dove il primo byte è intestazione e 7 byte rimanenti sono i dati.

Stanno cercando di passare una particolare stringa ID ma la stringa ID è lunga 8 caratteri (ASCII), quindi non si adatta a 7 byte.

Quello che mi ha detto il mio collega è che trasformeranno gli 8 byte ascii della stringa originale in numeri interi (decimali) e me ne invierò 4 byte. Mi hanno detto che dovrei essere in grado di ottenere la stringa originale dai 4 byte. Sto attraversando un periodo difficile a pensarci su.

Quindi se hai una stringa ID come "IO123456", questo è 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36 in ASCII .. In che modo puoi comprimerlo in 4 byte trasformandolo in un numero intero e posso ottenere l'originale stringa da esso? Mi manca qualcosa o il mio collega si sbaglia? Capisco che questa sia una domanda davvero bizzarra ma questo non ha alcun senso per me.

    
posta l46kok 17.01.2013 - 05:35
fonte

5 risposte

16

L'ID è sempre nella forma: IO123456? Ciò che il tuo collega potrebbe significare è che invia solo la parte numerica, che si adatta facilmente in 4 byte omettendo la parte "IO".

    
risposta data 17.01.2013 - 05:52
fonte
14

Se i primi due caratteri non sono costanti (ma sono sempre lettere) e i sei caratteri rimanenti sono sempre numeri, una stringa come "IO123456" può essere impacchettata in 5 byte convertendo i numeri in decimale in formato binario (BCD):

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
             |    |      \   /     \   /     \   /
            0x49 0x4f     0x12      0x34      0x56

Se esiste un insieme limitato di possibili identificatori (le prime due lettere), puoi codificarli in un numero e inviarlo (a condizione che non ci siano più di 256 combinazioni), ad esempio:

IO -> 0x00
RD -> 0x01
WT -> 0x02
   ...
AB -> 0x10
   ...
ZZ -> 0xff

in modo che la stringa originale sia impacchettata in 4 byte senza alcuna perdita di informazioni:

IO123456 -> 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36
              \    /     \   /     \   /     \   /
               0x00       0x12      0x34      0x56

Ovviamente questo processo può anche essere annullato per ottenere la stringa ID originale.

    
risposta data 17.01.2013 - 12:13
fonte
3

Se la stringa può essere una qualsiasi sequenza di caratteri:

  • Se si può essere certi che le stringhe non utilizzino il bit più significativo in ogni byte, è possibile ridurle a sette bit e utilizzare le operazioni bit a bit per spostare i 56 bit rimanenti nei 56 bit che si disponibile.

  • Se le stringhe sono solo lettere e cifre, crea una rappresentazione a 6 bit di quel set e crea una stringa a 48 bit del tuo identificatore.

Se il formato è sempre composto da due lettere seguite da una stringa di cifre:

  • Lascia solo i primi due byte e codifica il numero in un intero di sei byte. IO123456 diventa 0x49 0x4f 0x01E240 .

  • Lascia i primi due byte da solo e impacchetta le cifre come decimale con codice binario . IO123456 diventa 0x49 0x4f 0x12 0x34 0x56 .

risposta data 17.01.2013 - 12:58
fonte
1

Dal contesto della domanda pubblicata qui, punta a un protocollo industriale chiamato HART. Questo protocollo ha un modo unico di avvolgere i caratteri ASCII. Si chiama come Packed-ASCII. Ma ancora non impacchetta gli 8 personaggi a 4! Secondo Packed-ASCII, gli 8 byte ASCII sono convertiti in 6. 4 a 3 e così via.

In questo protocollo, la lunghezza dei parametri in una determinata richiesta è sempre fissa. Quindi i personaggi rimanenti devono essere riempiti dai caratteri Spazio. Tuttavia, tutto questo è specifico per HART. Se confermi che stai lavorando su questo, metterò la procedura esatta di imballaggio e amp; disimballaggio.

    
risposta data 24.07.2013 - 12:22
fonte
0

Probabilmente convertendo '0123456' in un intero lungo.

Ma funzionerebbe solo con gli ID numerici.

Un altro schema possibile sarebbe quello di convertire la codifica ECMA-1 da 7 a 6 bit che ti darebbe una stringa da sei byte ma saresti limitato al set di caratteri in lettere maiuscole e un numero limitato di caratteri di punteggiatura.

    
risposta data 17.01.2013 - 05:59
fonte

Leggi altre domande sui tag