2009-11-20 10 views
7

Oto dziwny problem, który mnie trochę zbijał.Drukowanie wartości szesnastkowych tablicy znaków * w C daje wartości nieparzyste dla wejścia binarnego

Program jest napisany w C89 i czyta plik w tablicy char * 16 bajtów na raz (przy użyciu fread i sizeof size (char)). Plik jest fopen'd z flagami "rb". Tablica jest następnie przekazywana do funkcji, która w zasadzie przyjmuje 16 wartości szesnastkowych i umieszcza ją w łańcuchu, przy czym każda wartość jest oddzielona spacją.

Oto miejsce, w którym pojawia się dziwność. Ta funkcja generuje ładunek heksadecymalny, 16 bajtów na raz, dla danych wejściowych do pliku tekstowego, które mam. Ale wkręca się, gdy próbuję go na małym obrazie bitmapowym - kończę z wyjściem w łańcuchu jak ffffff88 zamiast tylko 88.

Wartości szesnastkowe są umieszczane w łańcuchu wyjściowym za pomocą sprintf ("% 02x" , input [i]); w pętli.

Dlaczego to działa poprawnie w przypadku niektórych plików, ale inne nie?

Odpowiedz

9

co widzisz jest wynikiem rozszerzenia znak z char do int, używając unsigned char * lub odlewanie do unsigned char przed oddanych do int jest (domyślnie?) Wykonywane powinno rozwiązać problem.

11

W C znak char jest traktowany jako wartość podpisana, chyba że zostanie określony jako niepodpisany. Wydaje się, że kiedy przekazujesz parametry do funkcji, to gdy parametr jest char, jest on wyrównywany do wielkości zwykłej liczby całkowitej. Jeśli nie wskażesz kompilatorowi, że powinno to zostać wykonane w sposób bez podpisu, 128 staje się 0xFFFFFF80, i tak dalej.

Tak więc przedłużenie znaku następuje przed tym, zanim formater wydruku kiedykolwiek przyjrzy się wartości. Oznacza to, że

printf("%02X", (unsigned) input[i]); 

nie rozwiąże problemu, jako wartość wejściowego [I] będzie znak rozszerzony, więc wszystkie wartości od 128 do 255 są traktowane jako -127 do -1 i stać 0xFFFFFF80 do 0xFFFFFF, a następnie odrzuć, podczas gdy zrobi lewy, ale jest trochę niezgrabny i trudny do odczytania. Najlepiej, aby typ danych wejściowych [] był bez znaku char w pierwszej kolejności.

Powiązane problemy