Estoy tratando de tomar 21 bytes de datos que identifican de forma única una operación y almacenarlos en una matriz de 16 bytes char
. Tengo problemas para encontrar el algoritmo correcto para esto.Comprimir 21 caracteres alfanuméricos en 16 bytes
El ID de comercio, que estoy tratando de comprimir consta de 2 campos:
- 18 caracteres alfanuméricos consistentes en los caracteres ASCII 0x20 a 0x7E, Incluido. (32-126)
- una cadena numérica de 3 caracteres "000" a "999" clase
Así que un C++ que abarque estos datos tiene el siguiente aspecto:
class ID
{
public:
char trade_num_[18];
char broker_[3];
};
Este necesidades de datos que se almacena en una estructura de 16 char
de datos, que se ve así:
class Compressed
{
public:
char sku_[16];
};
traté de aprovechar el hecho de que, dado que los personajes de trade_num_
son solo 0-127 había 1 bit sin usar en cada personaje. Del mismo modo, 999 en binario es 1111100111, que está a solo 10 bits - 6 bits menos que una palabra de 2 bytes. Pero cuando averiguo cuánto puedo exprimir esto, lo más pequeño que puedo hacer es 17 bytes; un byte demasiado grande.
¿Alguna idea? Por favor, trade_num_
es un nombre inapropiado. Puede contener letras y otros caracteres. Eso es lo que dice la especificación.
EDIT: Perdón por la confusión. El campo trade_num_
es de hecho 18 bytes y no 16. Después de publicar este hilo, mi conexión a Internet murió y no pude volver a este hilo hasta ahora.
EDIT2: Creo que es seguro hacer una suposición sobre el conjunto de datos. Para el campo trade_num_, podemos suponer que los caracteres ASCII no imprimibles 0-31 no estarán presentes. Tampoco lo harán los códigos ASCII 127 o 126 (~). Todos los demás pueden estar presentes, incluidas letras mayúsculas y minúsculas, números y signos de puntuación. Esto deja un total de 94 caracteres en el conjunto que comprenderá trade_num_
, códigos ASCII 32 a 125, inclusive.
¿la compresión tiene que ser bidireccional (es decir, es aceptable un hash unidireccional)? Si es así, ¿podrías usar una tabla de búsqueda para mapear? – Alan
¿Los caracteres son alfanuméricos (letras y dígitos solamente) o pueden ser cualquier carácter ASCII? –
¿Por qué es trade_num [18] cuando solo necesita almacenar 16 bytes? – Alan