Записать 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 (просто увеличивая свою базу, не уменьшая ее).
Каждое значение будет записано в два байта и объединено с последним / следующим байтом по сдвигу и / или операциям.
Я надеюсь, что это очень абстрактное описание поможет вам.