Вот код для небольшого сдвига бит-бит, я хочу преобразовать его в бит-бит. пожалуйста, помогите мне. на самом деле это код декомпрессии 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;
}
}
Вы, вероятно, хотите что-то вроде этого.
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, измените индексы, и все останется неизменным.
Хорошая напыщенность на конкретизацию и код, который люди, кажется, пишут, если хотите больше.
Хорошая идея - маскировать (выполнять побитовое ИЛИ против) байты по одному, а затем менять их. Очевидно, что если вы смещаете 16-битное целое число, незамасленные биты будут просто отброшены либо забвение. Но для целых чисел, которые больше, чем 16 бит (на самом деле мне приходилось использовать 24-битные целые числа), лучше всего замаскировать каждый байт перед сменой и рекомбинацией (выполнить побитовое ИЛИ).
inbitbuf
, и он будет читать данные сinbitbuf
байтов.