2017-02-17 51 views
0

Я был возился с небольшим количеством кода и решил попытаться переключить некоторые фрагменты в файлах, а затем переключить их обратно, чтобы получить исходный файл. Так или иначе, он изменяет бит, но не изменит их.Переключатель битов, но не переключает их обратно?

Вот что у меня есть:

Волшебство происходит мною открытие файла и Fread в rByte [0] и rByte [1].

unsigned char rByte[] = {0, 0}; 

int isBitSet(unsigned char byte, int bytePosition){ 

    unsigned char mask[] = {128, 64, 32, 16, 8, 4, 2, 1}; 
    return ((byte & mask[bytePosition]) != 0); 
} 

unsigned char setBit(unsigned char byte, int pos) { 
    byte |= (0x01 << pos); 
    return byte; 
} 

unsigned char clearBit(unsigned char byte, int pos){ 
    byte &= ~(0x01 << pos); 
    return byte; 
} 

/* DO NOT TOUCH */ 

void switchBits (unsigned char byte1, unsigned char byte2, int x, int y) { 

    int reg1 = 0; 
    int reg2 = 0; 

    reg1 = isBitSet(byte1, x); 
    reg2 = isBitSet(byte2, y); 

    if ((reg1 == reg2)) { 

    } 

    if ((reg1 == 0) && (reg2 != 0)){ 
     rByte[0] = setBit(byte1, x); 
     rByte[1] = clearBit(byte2, y); 
    } 

    if((reg2 == 0) && (reg1 != 0)){ 
     rByte[0] = clearBit(byte1, x); 
     rByte[1] = setBit(byte2, y); 
    } 

} 

Теперь, я полагаю, что если будет применен тот же switchBits(), как я воспринимаю это, программа должна вернуться к регулярным. Я сделал музыкальный файл, создавая странные звуки, но не вернулся к нормальной жизни.

+0

Если бит может быть более 1, вы переключаетесь следующим образом: 0 1 2 3 (оригинал) -> 1 0 3 2 (переключается)? –

+0

switchBits (rByte [0], rByte [1], 4,5); должен переключить четвертый и пятый бит thr два байта – WickSec

+1

Может быть, вы должны использовать else, если вместо большого количества if. Потому что, если изменения сделаны, изменений больше не требуется. –

ответ

5

Предполагая, что rByte определено глобально (что не приятно).

У вас есть позиция ваших битов, перевернутых в isBitSet() по сравнению с setBit() и clearBit().

Пример предполагая pos = 0

isBitSet проверяет MSB (старший бит) как mask[0] == 128 но в setBit и clearBit функции вы переносите 0x01 << 0 означает, что она соответствует 1.

редактировать: Что я предлагаю вам изменить

unsigned char mask[] = {128, 64, 32, 16, 8, 4, 2, 1}; 

в

unsigned char mask[] = {1, 2, 4, 8, 16, 32, 64, 128}; 

редактировать конец

Вы должны overthink вашу конструкцию функции, только сцепление if сек кажется вполне странно, и логика, которую вы хотите реализовать, может быть улучшена. Вот пример с упрощенной логикой, вы можете сделать это другим способом, чтобы быть более конкретным в логике, поэтому просто рассматривайте это как предложение.

if ((reg1 == reg2)) { 

} 
else{ 
    if ((reg1 == 0)){ 
    rByte[0] = setBit(byte1, x); 
    rByte[1] = clearBit(byte2, y); 
    } 

    else{ 
    rByte[0] = clearBit(byte1, x); 
    rByte[1] = setBit(byte2, y); 
    } 
} 

Еще одна вещь, которая позволит упростить программу снова будет функцией переключатель, который просто делает 0 из 1 и наоборот. Это легко сделать с помощью XORoperator ^. Если оба варианта разные, вам просто нужно переключить состояние обоих битов, чтобы уменьшить вашу функцию.

if ((reg1 != reg2)) { 
    rByte[0] = switchBit(byte1,x); 
    rByte[1] = switchBit(byte2,y); 
} 
+0

Это глобально определено, но я спрашиваю, почему это не сработает, если я дважды переключу биты(). Например, почему бы мне не получить исходные байты. Я предполагаю, что это орд? – WickSec

+0

И если бы вы могли бы привести мне пример в коде? – WickSec

+0

Я сказал вам причину. Это потому, что вы ищете разные биты в isBitSet(), затем вы изменяете свои функции ниже –