Как сдвинуть биты с прямым порядком байтов в C ++

0

Вот код для небольшого сдвига бит-бит, я хочу преобразовать его в бит-бит. пожалуйста, помогите мне. на самом деле это код декомпрессии LZW, используя небольшой эндианский сдвиг. но я хочу большой код

unsigned int input_code(FILE *input)
{
unsigned int val;
static int bitcount=0;
static unsigned long inbitbuf=0L;

  while (bitcount <= 24)
  {
      inbitbuf |=(unsigned long) getc(input) << (24-bitcount);
      bitcount += 8;
  }

  val=inbitbuf >> (32-BITS);
  inbitbuf <<= BITS;
  bitcount -= BITS;

  return(val);
}


void output_code(FILE *output,unsigned int code)
{
static int output_bit_count=0;
static unsigned long output_bit_buffer=0L;

output_bit_buffer |= (unsigned long) code << (32-BITS-output_bit_count);
output_bit_count += BITS;
while (output_bit_count >= 8)
{
    putc(output_bit_buffer >> 24,output);
    output_bit_buffer <<= 8;
    output_bit_count -= 8;
}
}
  • 0
    Вы говорите, что файл с прямым порядком байтов? Порядковый номер платформы в этом случае не имеет значения, поскольку в памяти не обрабатываются отдельные байты.
  • 0
    @VaughnCato Данные в формате с прямым порядком байтов, и этот код читает / записывает формат с прямым порядком байтов (это не зависит от порядкового номера платформы). Например, начните с чтения в LSB вместо MSB inbitbuf , и он будет читать данные с inbitbuf байтов.
Показать ещё 1 комментарий
Теги:
endianness

2 ответа

2

Вы, вероятно, хотите что-то вроде этого.

unsigned char raw[4];
unsigned int val;
if (4 != fread(raw, 1, 4, input)) {
  // error condition, return early or throw or something
}
val = static_cast<unsigned int>(data[3])
    | static_cast<unsigned int>(data[2]) << 8 
    | static_cast<unsigned int>(data[1]) << 16 
    | static_cast<unsigned int>(data[0]) << 24; 

если вы делаете маленький endian, измените индексы, и все останется неизменным.

Хорошая напыщенность на конкретизацию и код, который люди, кажется, пишут, если хотите больше.

1

Хорошая идея - маскировать (выполнять побитовое ИЛИ против) байты по одному, а затем менять их. Очевидно, что если вы смещаете 16-битное целое число, незамасленные биты будут просто отброшены либо забвение. Но для целых чисел, которые больше, чем 16 бит (на самом деле мне приходилось использовать 24-битные целые числа), лучше всего замаскировать каждый байт перед сменой и рекомбинацией (выполнить побитовое ИЛИ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню