2013-03-26 17 views
5

Mam plik binarny, który będzie odczytywany jako znaki. Każda postać została przesunięta nieco na lewą nieznaną liczbę razy (przy założeniu, że owinięty) przez kogoś innego. Chcę móc czytać w każdej postaci, a następnie owijać przesunięcie w prawo (liczba przesunięć, które prawdopodobnie będę musiała być ustalona ręcznie, ponieważ nie wymyśliłem innego sposobu).Trochę przesuwając postać z wrapem? C++

Tak, moja obecna idea jest taka, że ​​czytałem w charakterze, należy utworzyć kopię z temp, a następnie użyć XOR:

char letter; //will hold the read in letter 
char temp;  //will hold a copy of the letter 
while(file.read(&letter, sizeof(letter)) //letter now holds 00001101 
{ 
    temp = letter; //temp now holds 00001101 
    letter >>= 1; //shift 1 position to the right, letter now holds 00000110 
    temp <<= 7;  //shift to the left by (8-1), which is 7, temp now holds 10000000 
    letter ^= temp; //use XOR to get the wrap, letter now holds 10000110 
    cout << letter; 
} 

To ma sens w moim wyczerpanym głowy, ale to nie działa .. i nie mogę zrozumieć dlaczego. Rozmiar znaku to 1 bajt, więc doszedłem do wniosku, że muszę tylko zadzwonić z 8 bitami.

Każda pomoc zostanie doceniona.

EDYCJA: Rozwiązany. Dziękuję wszystkim. Kochaj tę społeczność na śmierć, jesteście niesamowici!

+0

You” Powiedzieliśmy nam, czego oczekujesz - co właściwie dostajesz? –

+0

@ftopbit Niektóre tajemnicze bałagan. –

+0

Czytasz do 'letter' dwa razy na pętlę, odrzucając wartość pierwszego odczytu – jthill

Odpowiedz

10

Zwróć uwagę na znak char znaku. Na wielu systemach jest podpisany. Twój letter >>= 1 jest znakiem wypełniającym przesunięcie.

obrotowe całkowitymi zwykle odbywa się w następujący sposób

letter = ((unsigned char)letter >> 1) | (letter << 7); 

Jak Mark zwraca uwagę w komentarzach, można użyć jednego lub | lub XOR ^.

+1

BOOM! To działało na mojego przyjaciela! Dziękuję bardzo. Nie użyłem edytowanego kodu, ale spróbuję. To, co zrobiłem, było odczytywane w gipsie na niepodpisany char i działało jak czar. Wielkie dzięki za wskazanie niepodpisanej rzeczy ... nie mogę uwierzyć, że to przegapiłem. –

+0

Jeśli nie ma nakładających się bitów, 'lub' i 'xor' będą dawać takie same wyniki. –

+0

@MarkRansom Masz rację. To nawet nie przyszło mi przez myśl. – Kyurem

0

Oświadczenie temp <<= 7 traci bity, które chcesz zawinąć. Będziesz musiał pętli przesuwać się w lewo o jeden bit na raz. Najpierw sprawdź najważniejszy bit char i jeśli ustawisz przesuwając go w prawo najbardziej, zanim wykonasz przesunięcie.

+0

temp został przesunięty o 7 w lewo, ponieważ litera jest przesunięta raz w prawo. Kiedy używam XOR na obu, daje mi to trochę, które zostało upuszczone po prawej stronie (a teraz jest po lewej stronie, owinięte wokół). –

0

byłbym skłonny zastosować większy typ integralną.

unsigned val = (unsigned)letter & 0xFF; 
val |= val << 8; 

Teraz po prostu trzeba zmieniać wartości w val bez dodatkowego kodu do zawijania wysokie bity z powrotem w

Powiązane problemy