В отношении операторов сдвига в разделе 6.5.7 стандарта C говорится:
Если значение правого операнда отрицательное или больше или , равное ширине продвинутого левого операнда, то поведение равно неопределенным.
Итак, во-первых, удалите nBuffer << 8;
. Даже если бы он был четко определен, это не был бы оператор присваивания.
Как люди уже говорили, вы бы лучше использовать CHAR_BIT
чем 8. Я довольно уверен, вместо 0x7f
вы имеете в виду UCHAR_MAX >> 1
и вместо 7 вы имели в виду CHAR_BIT - 1
.
Давайте просто сосредоточимся на nBuffer и bit_count, здесь. Я буду комментировать все, что не использует ни одно из них.
bit_count += 7;
if (bit_count == 7*8)
{
*out_buf++ = nBuffer;
/*if((write(out_fd, bit_buf, sizeof(char))) == -1)
oops("Cannot write on the file", "");*/
nBuffer << 8;
bit_count -= 8;
}
nBuffer = 0;
bit_count = 0;
В конце этого кода, каково значение nBuffer? Как насчет bit_count? Какое влияние это повлияет на ваш второй цикл? while (bit_count > 0)
Теперь давайте сосредоточимся на закомментированного код:
if((write(out_fd, bit_buf, sizeof(char))) == -1)
oops("Cannot write on the file", "");
Где вы назначая значение для bit_buf? Использование неинициализированной переменной - это неопределенное поведение.
Что это такое 'nBuffer << 8;'? – ouah
Если на '8' вы имеете в виду количество бит в символе, используйте' CHAR_BIT'. Магические числа очень трудно справиться. –
все, что я хочу сделать, это переписать его, это выглядит действительно неправильно для меня.Это похоже на то, как вы пытаетесь выполнить битрейт по счету, который больше байта. –