2013-11-23 91 views
0

這裏是小端位移的代碼,我想將它轉換成大端位移。 請幫我一把。實際上這是使用little endian shift的LZW解壓縮代碼。 但我想要大端代碼如何在C++中移位big endian中的位

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

你是說這個文件是big endian嗎?在這種情況下平臺的字節順序無關緊要,因爲內存中沒有單獨的字節正在被尋址。 –

+0

@VaughnCato * data *是大端,這個代碼讀/寫一個大端格式(這是獨立於平臺端)。例如首先讀入LSB而不是'inbitbuf'的MSB,它會讀取小端數據。 – nos

+0

非常感謝 – Rokso

回答

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

它是一個好主意,在移動它們之前,一次一個掩碼(對一個字節執行按位或)。顯然,如果你要移動一個16位的整數,那麼未被屏蔽的位將會被忽略掉。但對於大於16位的整數(我實際上必須使用24位整數),最好在移位和重新組合(對其執行按位或操作)之前屏蔽每個字節。