Существуют ли какие-либо алгоритмы сжатия, в которых меньшая единица является битом, а не байтом?
Любой здравый алгоритм сжатия на основе энтропии будет работать на уровне «битов» и, таким образом, отображать ожидаемое поведение. При передаче ему входного сигнала, который состоит только из байтов «00000001» и «00000000», кодер в некотором смысле «видит», что вход состоит из чертовски большого количества битов «0», вызванных несколькими «1» - это адаптируется к этой ситуации и достигнет хороших коэффициентов сжатия с помощью таблиц (или того, что компрессор использует для представления своего состояния) для обработки этого случая.
Если вы действительно используете все биты в байте, энтропия («случайность») входа намного выше, поэтому, хотя у вас есть вход, размер которого составляет только 1/8, вы также можете сделать Работа компрессора значительно сложнее, и от этого пострадает степень сжатия. В любом случае, я абсолютно уверен, что это правильный путь, так как вы не полагаетесь на компрессор, который может или не может быть хорош в обнаружении «схемы множества нулей», которую вы используете во входных данных.
Или какие-нибудь приемы, которые я могу использовать, чтобы снизить случайность данных?
Эти "уловки" включают в себя выполнение преобразований для ваших входных данных, чтобы уменьшить энтропию входных данных. То, что вы можете здесь сделать, действительно зависит от характера ваших входных данных. Если это действительно черно-белые «изображения», вы можете взглянуть на JBIG или проверить преобразования, определенные в стандарте изображения PNG.