В общем и целом,
ответ на Ваш вопрос - нет, нельзя. как ни крути, из 3х байт 2 байта не сделать без потерь.
Иначе кто-нить уже давно бы сделал архиватор до 2х байт всего чего угодно...
Но в порядке альтернативного секса в голову, давайте покумекаем.
- Если вы запишите в строку все биты 3х байтового числа, то получите последовательность нулей и единиц. Можно попробовать сжать эту строку например zlib.compress в памяти, отрезать стандартный двухбайтовый заголовок и посмотреть на то что получилось. Если влезет в 2 байта - то да. Обратное преобразование такое - добавляем заголовок zlib, делаем zlib.decompress и переводим в байты.
Тыдыщщщ, а если сжатая строка не влазит - то ничего не получится.
Не взлетит. ;-)
- Еще вариант, когда есть какие-то известные ограничения на серийные номера. Например, вы знаете, что они все в диапазоне 1000 - 66000. Тогда да =) влезет в 2 байта. Даже если диапазонов несколько, главное чтобы количество значений было не больше 2^16.
В остальных случаях - i'm sorry, be happy.
ЗЫ: тему сжатия можно раскрутить, придумав многопроходные схемы, типо сначала начальный бит, потом бит разницы со следующим, а потом к этой строке сжатие, сразу сжатие бит по Хаффману с какой-нить популярной таблицей (готовой ибо передавать таблицу вам негде); попробовать
арифметическое кодирование к битам с длиной.
Но все это дурь космическая - найдите место для байта. ;-)
Это кажется про Вас =) :
Повесть об одном байтеДругой линк