这是小端位移的代码,我想用大端位移转换它。 请帮帮我。实际上这是使用小端移位的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 :(得分: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;
如果您正在做小端,请反转索引,一切都保持不变。
好的rant on endianness和人们似乎写的代码,如果你想要更多。
答案 1 :(得分:1)
在移动它们之前,一次一个地掩码(执行按位或反对)字节是一个好主意。显然,如果你正在移动一个16位整数,那么未屏蔽的位将被推迟到任何一端被遗忘。但对于大于16位的整数(实际上我必须使用24位整数),最好在移位和重新组合(执行按位OR)之前屏蔽每个字节。