Преобразование из 8 бит в 1 байт

У меня есть строка из 8 бит, и я хочу преобразовать ее в 1 байт. Я не уверен, почему моя функция не работает должным образом. У меня есть 8 битов, хранящихся в массиве из 8 неподписанных символов. Это мой метод до сих пор:

unsigned int bitsToBytes(unsigned char *bits)
{
unsigned int sum = 0;
for(int i = 7; i >= 0; i--)
{
sum += bits[i];
sum<<=1;
}
return sum;

}

int main()
{
unsigned char bits[8];
unsigned int byt;
byt = bitsToBytes(bits);
cout << byt; //doesn't give me the right result
}

РЕДАКТИРОВАТЬ: мой массив битов содержит «1» и «0» в массиве! Извините, что не ясно.

Может кто-нибудь знает, где я ошибся в этом? Я не уверен, почему мои биты не преобразуются в байты должным образом. Может ли кто-нибудь помочь? Спасибо!

4

Решение

sum += bits[i];

Если вы пытаетесь конвертировать C строка (например, "1010101"), этот код добавляет значение кодируемой таблицы (ASCII, UTF-8, в зависимости от того, какая у вас кодировка) символа (например, 48 и 49), а не 1 а также 0, Вы должны переписать это как

sum += bits[i] - '0';

Кроме того, вы не инициализируете bits массив — использование его содержимого до инициализации приводит к неопределенному поведению, поэтому вы можете объяснить что-нибудь произойдет.

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

for (int i = 7; i >= 0; i--)

должно быть

for (int i = 0; i < 8; i++)
5

Другие решения

Это должно работать правильно, в нормальных ситуациях.

Что содержит символ []? Содержит ли он «0», «1» вместо 0, 1?

Чтобы убедиться, измените строку

sum += bits[i];

в

sum |= bits[i] & 1;

Также, как отметил Вон Катон в комментариях, нужно сместить до добавление.

1

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

в частности взгляните на функции encodeByte и decodeByte

Эскиз для передачи битов суть

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector