Записать 9-битные двоичные данные в C

Я пытаюсь записать в файл двоичные данные, которые не помещаются в 8 бит. Из того, что я понимаю, вы можете написать двоичные данные любой длины, если вы можете сгруппировать их в предопределенную длину 8, 16, 32,64. Есть ли способ записать только 9 бит в файл? Или два значения по 9 бит?

У меня есть одно значение в диапазоне -+32768 и 3 значения в диапазоне +-256. Какой способ сэкономить большую часть пространства?

Спасибо

3 ответа

Нет, я не думаю, что есть какой-либо способ использования файлового ввода-вывода C:s для экспресс-хранения менее 1 char данных, которые обычно будут 8 бит.

Если вы в 9-битной системе, где CHAR_BIT на самом деле 9, то это будет тривиально.

Если вы действительно спрашиваете: "Как я могу хранить число с ограниченным диапазоном, используя точное необходимое количество бит", внутри возможно большего файла, то это, конечно, очень возможно.

Это часто называют потоком битов и является хорошим способом оптимизировать пространство, используемое для некоторой информации. Кодирование / декодирование форматов битового потока требует, чтобы вы отслеживали, сколько битов вы "использовали" из текущего байта ввода / вывода в реальном файле. Это немного сложно, но не очень сложно.

В основном вам понадобится:

  • Поток байтов sто есть что-то, что вы можете поместить байты, такие как FILE *,
  • Немного индекс iто есть значение без знака, которое отслеживает, сколько битов вы выпустили.
  • Текущий байт x, в которые можно вставлять биты, каждый раз увеличивая i, когда i достигает CHAR_BITнапиши это s и сбросить i в ноль.

Вы также не можете хранить значения в диапазоне от –256 до +256 в девяти битах. Это 513 значений, и девять битов могут различать только 512 значений.

Если ваши фактические диапазоны составляют от –32768 до +32767 и от –256 до +255, то вы можете использовать битовые поля, чтобы упаковать их в единую структуру:

struct MyStruct
{
    int a : 16;
    int b :  9;
    int c :  9;
    int d :  9;
};

Такие объекты, как этот, все равно будут округлены до целого числа байтов, поэтому вышеописанное будет иметь шесть байтов в типичных системах, поскольку в нем используется всего 43 бита, а следующее целое число восьмибитных байтов имеет 48 битов.

Вы можете либо принять это заполнение от 43 бит до 48, либо использовать более сложный код для дальнейшего объединения битов перед записью в файл. Это требует дополнительного кода для сборки битов в последовательности байтов. Это редко стоит усилий, так как место для хранения в настоящее время дешево.

Вы можете применить принцип base64 (просто увеличивая свою базу, не уменьшая ее).

Каждое значение будет записано в два байта и объединено с последним / следующим байтом по сдвигу и / или операциям.

Я надеюсь, что это очень абстрактное описание поможет вам.

Другие вопросы по тегам