Intereting Posts
Как вычисляется pow () в C? Мотивация для бесполезного prologа в gcc-compiled main (), отключив его? Самый тщательный способ конкатенации строк в C Понимание цели указателей C Ошибка графической библиотеки Как строки паскаля представлены в памяти? Почему производительность cgo настолько медленная? что-то не так с моим тестовым кодом? Как компиляторы C реализуют функции, которые возвращают большие структуры? Могут ли все функции в streamе иметь доступ к динамически распределенной памяти (куче) даже без указания указателя или локально для функции? Указатель не будет работать в printf () множественное определение основной ошибки в eclipse с использованием C Определенный файл токена C для flex? Есть ли библиотека или другой способ выполнения 128-битных математических операций? Гибкий элемент массива (c99) внутри структуры Возвращаемое значение булевого выражения в C

используйте printf для печати символьной строки в шестнадцатеричном формате, искаженных результатов

Я хочу напечатать строку символов в шестнадцатеричном формате,

на машине A, что-то вроде

ori_mesg = gen_rdm_bytestream (1400,seed) sendto(machine B, ori_mesg, len(mesg)) 

на машине B

  recvfrom(machine A, mesg) mesg_check = gen_rdm_bytestream (1400, seed) for(i=0;i<20;i++){ printf("%02x ", *(mesg+i)& 0xFF); } printf("\n"); for(i=0;i<20;i++){ printf("%02x ", *(mesg_check+i)); } printf("\n"); 

seed варьируются от 1, 2 3 ….

функция генерации байтов:

 u_char *gen_rdm_bytestream (size_t num_bytes, unsigned int seed) { u_char *stream = malloc (num_bytes+4); size_t i; u_int16_t seq = seed; seq = htons(seq); u_int16_t tail = num_bytes; tail = htons(tail); memcpy(stream, &seq, sizeof(seq)); srand(seed); for (i = 3; i < num_bytes+2; i++){ stream[i] = rand (); } memcpy(stream+num_bytes+2, &tail, sizeof(tail)); return stream; } 

но я получил результаты от printf:

 00 01 00 67 c6 69 73 51 ff 4a ec 29 cd ba ab f2 fb e3 46 7c 00 01 00 67 ffffffc6 69 73 51 ffffffff 4a ffffffec 29 ffffffcd ffffffba ffffffab fffffff2 fffffffb ffffffe3 46 7c 

или же

 00 02 88 fa 7f 44 4f d5 d2 00 2d 29 4b 96 c3 4d c5 7d 29 7e 00 02 00 fffffffa 7f 44 4f ffffffd5 ffffffd2 00 2d 29 4b ffffff96 ffffffc3 4d ffffffc5 7d 29 7e 

почему так много mesg_check для mesg_check ?

есть ли потенциальные причины этого явления? Спасибо!

Вот небольшая программа, которая иллюстрирует проблему, я думаю, что у вас может быть:

 #include  int main(void) { char arr[] = { 0, 16, 127, 128, 255 }; for (int i = 0; i < sizeof arr; i ++) { printf(" %2x", arr[i]); } putchar('\n'); return 0; } 

В моей системе (на которой подписан char ), я получаю этот вывод:

  0 10 7f ffffff80 ffffffff 

Значение 255 , хранящееся в символе (подписанный), сохраняется как -1 . В вызове printf он преобразуется в (подписанный) int но формат "%2x" сообщает printf рассматривать его как unsigned int , поэтому он отображает fffffffff .

Убедитесь, что массивы mesg и mesg_check определены как массивы unsigned char , а не простой char .

ОБНОВЛЕНИЕ: Перечитав этот ответ более года спустя, я понимаю, что это не совсем правильно. Вот программа, которая работает правильно в моей системе и почти наверняка будет работать в любой разумной системе:

 #include  int main(void) { unsigned char arr[] = { 0, 16, 127, 128, 255 }; for (int i = 0; i < sizeof arr; i ++) { printf(" %02x", arr[i]); } putchar('\n'); return 0; } 

Выход:

  00 10 7f 80 ff 

Аргумент типа unsigned char продвигается до (подписанного) int (если предположить, что int может содержать все значения типа unsigned char , то есть INT_MAX >= UCHAR_MAX , что имеет место практически для всех систем). Таким образом, аргумент arr[i] продвигается до int , а для формата " %02x" требуется аргумент типа unsigned int .

Стандарт C строго подразумевает, но не совсем прямо указывает, что аргументы соответствующих подписанных и неподписанных типов взаимозаменяемы, если они находятся в пределах диапазона обоих типов - что здесь и происходит.

Чтобы быть полностью верным, вам нужно убедиться, что аргумент действительно имеет тип unsigned int :

 printf("%02x", (unsigned)arr[i]); 

Yup, всегда печатайте строку в шестнадцатеричном формате как:

 for(i=0;till string length;i++) printf("%02X",(unsigned char)str[i]); 

вы получите ошибку при попытке распечатать

целую строку за один раз и при печати символа Hex string символом, который использует «Unsigned char», если строка находится в формате, отличном от «Unsigned char»,