如何在c ++中移位big endian中的位

时间:2013-11-23 19:20:20

标签: c++ endianness

这是小端位移的代码,我想用大端位移转换它。 请帮帮我。实际上这是使用小端移位的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;
}
}

2 个答案:

答案 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)之前屏蔽每个字节。