2016-11-28 1 views
2

Моя программа C принимает случайное значение int high и преобразует его в шестнадцатеричный код и записывает его в файл. Все идет хорошо, если значение 225919 или менее например. 225875 является 00 03 72 53 но если значение превышает 225919 он начинает писать дополнительные ffffff для последнего байта в примере шестнадцатеричного значения 885943 является 00 03 72 ffffff97, в то время как правильное значение было бы 00 03 72 97.Преобразование int to hex не подходит для высоких значений 225943 преобразуется в 0x000372ffffff97

код, который записывает значение в файл выглядит следующим образом:

char *temp = NULL; 
int cze = 225943; 
temp = (char *)(&cze); 
for (ii = 3; ii >= 0; ii--) { 
    printf(" %02x ", temp[ii]); //just for printing the values 
    fprintf(in, "%02x", temp[ii]); 
} 

Выход: 00 03 72 ffffff97

Ожидаемый результат: 00 03 72 97

Пожалуйста, помогите, любой указатель ценится.

+0

Как раз в качестве стиля, определяющего «temp» со значением «NULL», то (почти) сразу присваивая ему новое значение, это пустая трата времени. Просто определите его, где он впервые получил значимое значение: 'char * temp = (char *) &cze;'. –

ответ

5

Ваш массив temp содержит char значения, которые в большинстве случаев означают signed char. Значения затем печатаются как подписанные char s, поэтому любой байт, превышающий 0x7f, считается отрицательным. Когда это значение передается в printf, оно неявно преобразуется в int. Это добавляет один или несколько байтов, содержащих все биты 1, если число отрицательно.

Изменение типа данных на unsigned char. Это приведет к изменению неявного продвижения на unsigned int, и вы получите правильные значения.

unsigned char *temp=NULL; 
int cze=225943; 
temp=(unsigned char *)(&cze); 
for(ii=3;ii>=0;ii--){ 
    printf(" %02x ",temp[ii]);//just for printing the values 
    fprintf(in,"%02x",temp[ii]); 
} 

В качестве альтернативы, вы можете использовать модификатор hh длины в printf, который говорит ему, что аргумент является char или unsigned char. Это ограничит печать на 1 байт данных.

+0

* "Это добавляет один или несколько байтов, содержащих все 1 бит, если число отрицательно." * - Расширение знака AKA – StoryTeller