Порядок битов / декодирование flac порядка следования байтов

В настоящее время я пытаюсь написать транскодер FLAC в WAV в качестве упражнения на С++, и в настоящее время я немного борюсь с формулировкой формата FLAC в отношении порядка битов.

Вот (маленький) раздел, посвященный заказу:

Все числа, используемые в битовом потоке FLAC, являются целыми числами; нет представлений с плавающей запятой. Все числа имеют кодировку с обратным порядком байтов. Все числа беззнаковые, если не указано иное.

Применяется ли это к порядку битов, а также к порядку байтов? В частности, если я прочитаю, скажем, 7-битное значение, получу ли я самый старший бит первым?


person Pulo    schedule 15.10.2019    source источник
comment
Как вы предлагаете читать отдельные биты?   -  person daShier    schedule 15.10.2019
comment
Вы можете поменять местами биты после их прочтения. Хотя это звучит как перебор.   -  person Pulo    schedule 15.10.2019


Ответы (1)


Порядок битов никогда не должен быть проблемой, если вы не используете struct с битовыми полями (что является хорошей причиной, чтобы избежать этого).

Кроме того, вы можете читать данные только по одному байту за раз. Если вы хотите прочитать 7 бит из байта, вам нужно применить битовую маску к значению байта.

Например, если байт содержит одно значение в старшем бите и другое в младших 7 битах, вы должны извлечь их следующим образом:

field1 = (byte & 0x80) >> 7;
field2 = byte & 0x7f;
person dbush    schedule 15.10.2019
comment
Хорошо, давайте возьмем в качестве примера заголовок блока метаданных. Я ожидаю, что по порядку, 1 бит, чтобы узнать, является ли он последним, 7 бит для типа, затем 24 бита (с прямым порядком байтов) для длины. 1-й байт, который я прочитал оттуда, бит0 — это последний флаг, а бит1-бит7 — это тип. Чтобы получить данные, я бы просто сделал: flag = byte & 1, type = (byte >> 1) Это хорошее понимание порядка? - person Pulo; 15.10.2019
comment
@Pulo Это поле имеет допустимое значение 0-127, поэтому извлеките его с помощью value & 0x7f - person dbush; 15.10.2019
comment
Итак, насколько я понимаю, это означает, что самый старший бит - это последний флаг, а тип строится с младшими битами. Спецификация говорит, что я должен ожидать сначала флаг, тип построен из младших битов, а последний флаг из старшего бита. Это хорошая оценка происходящего? - person Pulo; 15.10.2019
comment
@Pulo Правильно, так что вам нужно будет сделать flag = byte >> 7 и type = byte & 0xf - person dbush; 15.10.2019
comment
Отлично, именно то, что мне нужно было знать. Не могли бы вы добавить это к ответу для дальнейшего использования, и я с радостью приму его. - person Pulo; 15.10.2019