Я пытаюсь взять 21 байт данных, которые однозначно идентифицируют сделку и хранят ее в массиве размером 16 байт char
. У меня возникают проблемы с правильным алгоритмом для этого.
Торговый идентификатор, который я пытаюсь сжать, состоит из двух полей:
- 18 буквенно-цифровых символов состоящий из символов ASCII 0x20 - 0x7E, включительно. (32-126)
- 3-значная цифровая строка "000" до "999"
Итак, класс С++, который будет охватывать эти данные, выглядит следующим образом:
class ID
{
public:
char trade_num_[18];
char broker_[3];
};
Эти данные необходимо сохранить в структуре данных 16- char
, которая выглядит следующим образом:
class Compressed
{
public:
char sku_[16];
};
Я попытался воспользоваться тем, что, поскольку символы в trade_num_
равны 0-127, в каждом символе был один неиспользуемый бит. Аналогично, 999 в двоичном формате - 1111100111, что составляет всего 10 бит - на 6 бит меньше 2-байтового слова. Но когда я выясняю, насколько я могу сжать это, самое маленькое, что я могу сделать, это 17 байт; один байт слишком большой.
Любые идеи?
Кстати, trade_num_
является неправильным. Он может содержать буквы и другие символы. Вот что говорит спецификация.
EDIT: Извините за путаницу. Поле trade_num_
действительно 18 байт, а не 16. После того, как я опубликовал эту тему, мое интернет-соединение умерло, и я не мог вернуться к этой теме только сейчас.
EDIT2: Я думаю, что безопасно делать предположения о наборе данных. В поле trade_num_ мы можем предположить, что непечатаемые символы ASCII 0-31 не будут присутствовать. Также не будут ASCII-коды 127 или 126 (~). Все остальные могут присутствовать, включая буквы верхнего и нижнего регистра, цифры и пунктуации. Это дает в общей сложности 94 символа в наборе, в котором trade_num_
будет состоять из кодов ASCII с 32 по 125 включительно.