¿Cómo comprime cadenas ASCII en menos bytes?

12

Estoy trabajando con un dispositivo integrado con un protocolo único que envía mensajes a otros dispositivos y estoy creando una aplicación que analiza los paquetes enviados. Cada paquete lleva 8 bytes. El protocolo se define como donde el primer byte es el encabezado y los 7 bytes restantes son los datos.

Están tratando de pasar una cadena de identificación particular, pero la cadena de identificación tiene 8 caracteres de longitud (ASCII), por lo que no cabe en 7 bytes.

Lo que mi colega me dijo es que convertirán los 8 bytes ascii de la cadena original en entero (decimal) y me enviarán 4 bytes. Me dijeron que debería poder obtener la cadena original de los 4 bytes. Me está costando mucho entender esto.

Entonces, si tiene una cadena de identificación como "IO123456", eso es 0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36 en ASCII ... ¿Cómo puede comprimir eso en 4 bytes convirtiéndolo en un entero y puedo obtener la cadena original? ? ¿Me estoy perdiendo algo o mi colega se equivoca? Entiendo que esta es una pregunta realmente extraña, pero en serio no tiene ningún sentido para mí.

l46kok
fuente
1
Cada carácter ASCII toma solo 7 bits, por lo que una cadena con 8 caracteres ASCII puede almacenarse en 8 * 7 bits - 7 bytes.
luiscubal

Respuestas:

17

¿La identificación siempre tiene el formato IO123456? Lo que su colega podría decir es que solo envía la parte numérica, que se ajusta fácilmente en 4 bytes, omitiendo la parte "IO".

Pieter B
fuente
1
Esto fue. Los primeros dos bytes siempre están en letras y el resto en números, por lo que podría caber fácilmente en 4 bytes como dijiste. Aunque no sé de dónde vino el número arbitrario de 4 bytes, ya que 999999 en hexadecimal es F423F, por lo que son 3 bytes como máximo ..
l46kok
55
@ l46kok: los enteros de 3 bytes (24 bits) son muy raros, por lo que probablemente sea más fácil para ellos enviarlo como un entero de 32 bits (4 bytes). No me sorprendería por completo si lo obtiene en la representación nativa (orden de bytes) del dispositivo incorporado.
Bart van Ingen Schenau
16

Si los primeros dos caracteres no son constantes (pero siempre son letras) y los seis caracteres restantes son siempre números, una cadena como "IO123456" se puede empaquetar en 5 bytes al convertir los números en formato decimal codificado en binario (BCD):

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

Si hay un conjunto limitado de identificadores posibles (las dos primeras letras), puede codificarlos en un número y enviarlos en su lugar (siempre que no haya más de 256 combinaciones), por ejemplo:

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

para que la cadena original se empaquete en 4 bytes sin ninguna pérdida de información:

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

Por supuesto, este proceso también se puede revertir para obtener la cadena de ID original.

ProfetaV
fuente
3

Si la cadena puede ser cualquier secuencia de caracteres:

  • Si puede estar seguro de que sus cadenas no usan el bit más significativo en cada byte, puede cortar cada una de ellas a siete bits y usar operaciones bit a bit para cambiar los 56 bits restantes a los 56 bits que tiene disponibles.

  • Si las cadenas son solo letras y dígitos, cree una representación de 6 bits de ese conjunto y haga una cadena de 48 bits de su identificador.

Si el formato es siempre dos letras seguidas de una cadena de dígitos:

  • Deje los dos primeros bytes solos y codifique el número en un entero de seis bytes. IO123456se convierte 0x49 0x4f 0x01E240.

  • Deje los dos primeros bytes solos y empaque los dígitos como decimal codificado en binario . IO123456se convierte 0x49 0x4f 0x12 0x34 0x56.

Blrfl
fuente
1

Desde el contexto de la pregunta publicada aquí, apunta a un protocolo industrial llamado HART. Este protocolo tiene una forma única de envolver los caracteres ASCII. Se llama como empaquetado-ASCII. ¡Pero aún así no incluye los 8 caracteres a 4! Según Packed-ASCII, los 8 bytes ASCII se convierten a 6. 4 a 3 y así sucesivamente.

En este protocolo, la longitud de los parámetros en una determinada solicitud siempre es fija. Por lo tanto, los caracteres restantes deben ser rellenados con caracteres espaciales. Aún así, todo esto es específico de HART. Si confirma que está trabajando en esto, pondré el procedimiento exacto de empacar y desempacar.

OnkarK
fuente
0

Posiblemente convirtiendo '0123456' a un entero largo.

Pero esto solo funcionaría para ID numéricos.

Otro posible esquema sería convertir su codificación ECMA-1 de 7 a 6 bits que le daría una cadena de seis bytes, pero estaría limitado al conjunto de caracteres a letras mayúsculas y a un conjunto limitado de caracteres de puntuación.

James Anderson
fuente