Как мне работать с битовыми данными в C - PullRequest
2 голосов
/ 18 сентября 2011

В классе мне было поручено написать программу на C, которая распаковывает текстовый файл и распечатывает содержащиеся в нем символы. Каждый символ в файле представлен 2 битами (4 возможных символа).

Недавно мне сообщили, что байт не обязательно равен 8 битам во всех системах, а char не обязательно равен 1 байту. Это тогда заставляет меня задуматься, как же я должен знать, сколько бит загружено из файла, когда я загружал 1 байт. Также, как я должен хранить загруженные данные в памяти, когда нет типов данных, которые могут гарантировать установленное количество битов.

Как мне работать с битовыми данными в C?

Ответы [ 3 ]

2 голосов
/ 18 сентября 2011

Байт не обязательно 8 бит. Это, безусловно, правда. Символ, с другой стороны, определяется как байт - C не различает две вещи.

Однако системы, для которых вы будете писать, будут почти наверняка иметь 8-битные байты. Байты разных размеров по существу не существуют вне реально, действительно старых систем или определенных встроенных систем.

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

Учитывая, что это для класса, предполагают 8-битные байты , если не указано иное. Суть не в том, чтобы быть крайне независимой от платформы, а в том, чтобы научить вас кое-чему о битовой игре (или, возможно, битовых полях, но это зависит от того, что вы изучали в классе).

2 голосов
/ 18 сентября 2011

Вы можете использовать битовые поля в C. Эти индексы явно позволяют указать количество битов в каждой части поля, если вы действительно обеспокоены шириной.На этой странице обсуждается: http://msdn.microsoft.com/en-us/library/yszfawxh(v=vs.80).aspx

В качестве примера, посмотрите ieee754.h для использования в контексте реализации IEEE754 с плавающей запятой

1 голос
/ 18 сентября 2011

Это заставляет меня задуматься, откуда же мне знать, сколько биты загружаются из файла, когда я загружаю 1 байт.

Вам будет сложно найти платформу, где байт не является 8-битным. (хотя, как отмечено выше, CHAR_BIT может использоваться для проверки этого). Также уточните требования к мобильности у своего инструктора или изложите свои предположения.

Обычно биты извлекаются с использованием сдвигов и побитовых операций, например (x & 3) - самые правые 2 бита x. ((x>>2) & 3) - следующие два бита. Выберите правильный тип данных для платформ, на которые вы нацеливаетесь, или, как говорят другие, используйте что-то вроде uint8_t, если доступно для вашего компилятора.

Также см .: Тип, используемый для представления байта в ANSI (C89 / 90). C?

Я бы рекомендовал , а не , используя битовые поля. Также смотрите здесь:

Когда стоит использовать битовые поля?

...