@arkonst

Как можно преобразовать число из 3 байт в число из 2 байт?

Есть железо, у которого адрес является его серийным номером состоящим из 3 байт. Но мне необходимо как то преобразовать этот 3 байтный адрес , возможно с помощью какого-то математического кодирования в 2 байта. Это вообще возможно? Если до , то как?
  • Вопрос задан
  • 631 просмотр
Решения вопроса 1
Godless
@Godless
В общем и целом, ответ на Ваш вопрос - нет, нельзя. как ни крути, из 3х байт 2 байта не сделать без потерь.
Иначе кто-нить уже давно бы сделал архиватор до 2х байт всего чего угодно...

Но в порядке альтернативного секса в голову, давайте покумекаем.

  1. Если вы запишите в строку все биты 3х байтового числа, то получите последовательность нулей и единиц. Можно попробовать сжать эту строку например zlib.compress в памяти, отрезать стандартный двухбайтовый заголовок и посмотреть на то что получилось. Если влезет в 2 байта - то да. Обратное преобразование такое - добавляем заголовок zlib, делаем zlib.decompress и переводим в байты.
    Тыдыщщщ, а если сжатая строка не влазит - то ничего не получится.
    Не взлетит. ;-)
  2. Еще вариант, когда есть какие-то известные ограничения на серийные номера. Например, вы знаете, что они все в диапазоне 1000 - 66000. Тогда да =) влезет в 2 байта. Даже если диапазонов несколько, главное чтобы количество значений было не больше 2^16.

В остальных случаях - i'm sorry, be happy.

ЗЫ: тему сжатия можно раскрутить, придумав многопроходные схемы, типо сначала начальный бит, потом бит разницы со следующим, а потом к этой строке сжатие, сразу сжатие бит по Хаффману с какой-нить популярной таблицей (готовой ибо передавать таблицу вам негде); попробовать арифметическое кодирование к битам с длиной.
Но все это дурь космическая - найдите место для байта. ;-)

Это кажется про Вас =) : Повесть об одном байте
Другой линк
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
Spetros
@Spetros
IT-шник
Если это лаба на тему энтропии, то, да, можно.

А если это реальная задача, где одно и то же ПО будет проверять этот серийный номер, то, нет, нельзя.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Невозможно
Ответ написан
Комментировать
x67
@x67
хотите ли вы потерять информацию?
Если нет, то число должно быть меньше 2^16(без знака) или иметь какой то паттерн, например с 3 по 12 бит всегда нули.
В таком случае, у числа меньшего, чем 2^16 вы просто читаете два младших байта и получаете результат. Если число со знаком, то там сложнее - его модуль должен быть меньше 2^15, а в первый бит старшего байта нужно будет еще и копировать первый бит старшего байта старого числа.
Если есть какой-то паттерн, вы находите закон, по которому вы из двух байт можете восстановить три и реализуете его.
Еще есть случаи, когда вам может быть не нужна высокая точность, тогда можно поделить число на 2^8, то есть 256 и вы получите 2 байтное число, которое с погрешностью +128 -127 будет нести информацию о предыдущем числе.
напишите подробнее, что это за железо и что за адрес? Возможно в серийниках всегда есть постоянная часть или что то с адресом можно придумать.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Преобразовать можно - отрезав лишний байт, но видимо этот способ вам не очень подходит.
А для других способов нужно больше информации - какой язык программирования, что значит "адрес является его серийным номером", что это за адрес у вас такой, как вы потом будете использовать эти 2 байта?
Ответ написан
Комментировать
@arkonst Автор вопроса
Изначально решили что серийник будет адресом устройства. Это удобно, когда у нас нет привязок к мак адресу. Устройство простое, а серийный номер уникален для каждого устройства. Нужно 2 байта, потому что стандарт modbus не поддерживает 3 байтную запись адреса...ему надо 2 байта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы