Я был возился с небольшим количеством кода и решил попытаться переключить некоторые фрагменты в файлах, а затем переключить их обратно, чтобы получить исходный файл. Так или иначе, он изменяет бит, но не изменит их.Переключатель битов, но не переключает их обратно?
Вот что у меня есть:
Волшебство происходит мною открытие файла и 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()
, как я воспринимаю это, программа должна вернуться к регулярным. Я сделал музыкальный файл, создавая странные звуки, но не вернулся к нормальной жизни.
Если бит может быть более 1, вы переключаетесь следующим образом: 0 1 2 3 (оригинал) -> 1 0 3 2 (переключается)? –
switchBits (rByte [0], rByte [1], 4,5); должен переключить четвертый и пятый бит thr два байта – WickSec
Может быть, вы должны использовать else, если вместо большого количества if. Потому что, если изменения сделаны, изменений больше не требуется. –