-1

我正在处理一项处理压缩和解压缩的任务。更具体地说,游程编码的变体(9 位块)。我遇到的问题涉及“类型”位的符号。我能够获得所需的位,但是,在该位应该为 1 的情况下,我的 printf 返回 -1。这会让我相信我在移位时没有做正确的事情,但我不知道那可能是什么。

void bitShift(char * mostFreq, unsigned char * byteBuf, int byteCount) {
    char type;
    int typels = 0;
    int typers = 7;

    int i = 0;
    for(i = 0; i < byteCount - 1; i++) {
            type = byteBuf[i];
            printf("type before = %d\t", (unsigned int)type);
            type = type << typels;
            type = type >> typers;
            typels++;
            printf("type after = %d\n", (unsigned int)type);
    }/*End for i*/


    for(i = 0; i < byteCount; i++)
            byteBuf[i] = 0;

}/*End bitShift*/

void decompressFile(char * mostFreq) {
    unsigned char byteBuf[9] = { 0 };
    int num, byteCount, i;
    num = 0; byteCount = 0; i = 0;
    unsigned char buf;
    while((num = read(0,&buf, 1)) > 0) {
            byteBuf[byteCount] = buf;
            byteCount++;
            if(byteCount == 9) {/*Flush bytes if buffer is full*/
                    bitShift(mostFreq, byteBuf, byteCount);
                    for(i = 0; i < 9; i++) {
                            byteBuf[i] = 0;
                    }/*End for i*/
                    byteCount = 0;
            }/*End if*/
    }/*End while*/
    if(num == 0) {/*If EOF*/
            if(byteCount != 0) {/*Bits have not been flushed*/
                    bitShift(mostFreq, byteBuf, byteCount);
            }/*End if*/
    } else if(num < 0) {
            perror("Read error");
            exit(1);
    }/*End else if*/

}/*End decompressFile*/
4

1 回答 1

4

你的问题是你声明type为一个普通char的,在你的系统中似乎是一个签名类型。

因此,例如,当您有 时0x80,它实际上是-128一个负数,并且当它向右移动时,符号位被扩展:1 位:0xC0 (-64),2 位:0xE0 (-32),... 7 位:0xFF (-1)

将其更改为unsigned char并完成!

于 2013-04-01T01:57:56.073 回答