Я пытаюсь выполнить упражнение на языке C, целью которого является кодирование сообщения в QR-коде 2Q с помощью метода байтов. Это означает, что данная строка должна быть закодирована в сообщении с помощью:
0xEC11.Я попытался использовать структуру с битовыми полями, как в следующем коде, но это не сработало, потому что порядок битов не может быть установлен принудительно.
typedef struct
{
unsigned char mode : 4;
unsigned int length : 8;
unsigned char *message;
unsigned char eof : 4;
unsigned int padding : 16;
} code;
Я также попытался сдвинуть биты закодированного сообщения влево, но снова получил сообщение об ошибке «Ожидаемое значение int», что означает (если я правильно понял) я не могу сдвинуть структуру.
Может ли кто-нибудь предложить элегантный способ выполнения этой задачи?
Вам нужно конвертировать каждого члена отдельно. У Этот ответ есть одна идея преобразовать данные в непрерывный поток битов. Незначительное отличие от этого ответа в том, что ваши элементы данных имеют переменную длину, и вместо файла вы должны писать в выходной массив байтов.
Как говорит @ user694733, это поток биты, а не поток байты. Предполагая, что 8 бит / байт, эти 4-битные поля в данных действительно создают проблему - чтобы получить биты в правильном порядке, вам придется учитывать порядок байтов системы в каждом из байтов данных.





В конце концов я реализовал это с данными в uint8_t и битовым сдвигом.
Это означает, что я сохранил строку в массиве, а затем сдвинул ее, как показано ниже:
for(int n_digit = 0; n_digit <= length; n_digit++)
{
if (n_digit < length)
{
*(code + n_digit) = (*(code + n_digit) << 4) + (*(code + n_digit + 1) >> 4);
}
else if (n_digit == length)
{
*(code + n_digit) = *(code + n_digit) << 4;
}
}
Возможно, код не самого высокого качества, но работает отлично.
Вы не можете использовать битовые поля для отображения битов. Они просто слишком сломаны по замыслу. Вместо этого используйте массив
uint8_t[n]для хранения данных, а затем проанализируйте его оттуда. У вас также может быть соответствующая структура, если вы можете надежно отключить заполнение структур в своем компиляторе - иначе структуры не будут работать без процедур сериализации / десериализации.