Может кто-нибудь объяснить неожиданный вывод sprintf? - PullRequest
1 голос
/ 30 июля 2009

У меня очень простой sprintf вопрос.

int STATUS = 0;

char test[100];
int n = sprintf( test,"%04x", STATUS );
printf ("[%s] is a %d char long string\n",test,n);  

for(i=0 ; i<4 ; i++) {
  printf("%02x", test[i]); 
    }   
    printf("\n\n"); 

Вывод этого кода 30303030, что не является тем, что я намерен иметь в качестве вывода. В принципе, Я хотел бы иметь 00000000 в качестве вывода, поэтому целочисленное значение должно занимать 4 байта в моем выводе с его фактической стоимостью. Кто-нибудь может сказать мне, что я сделал не так?

Ответы [ 6 ]

4 голосов
/ 30 июля 2009

0x30 - это код ASCII для '0', вы смешиваете представления char и int.

2 голосов
/ 30 июля 2009

Кажется, вы конвертируете это в гекс. 30 является шестнадцатеричным для символа '0'. Измените первый sprintf на:

int n = sprintf( test,"%4d", STATUS );

или просто есть

printf("%08x", STATUS);
1 голос
/ 30 июля 2009

Звонок:

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

печатает каждый символ как целое число, используя 2 шестнадцатеричные цифры. 30 - это шестнадцатеричное для 48, которое является значением ascii для «0». Изменить на

 printf("%02c", test[i]); 

хотя я не уверен, что это будет то, что вы хотите в общем случае.

0 голосов
/ 30 июля 2009

Если вы хотите убедиться, что ваша переменная STATUS имеет ширину 4 байта, то включите inttypes.h (заголовок C99) и объявите его как:

uint32_t STATUS = 0;

если вы также хотите быть уверены, что это big-endian, вам придется объявить его как массив байтов:

unsigned char STATUS[4] = { 0x00, 0x00, 0x00, 0x01 } /* STATUS = 1, 32bit BE */

Уверен, это лучшее, что вы можете сделать в портативном компьютере.

0 голосов
/ 30 июля 2009

Он печатает 30 вместо 00, потому что вы печатаете целочисленное значение символа '0', которое в ASCII равно 0x30 или 48 в десятичном виде.

Если вы хотите увидеть необработанные байты, которые используются для определения целого числа, вы можете попробовать что-то вроде этого.

typedef union {
    int integerValue;
    uint8_t bytes[sizeof(int)];
} MyIntegerOrBytes;

void foo(void) {
    MyIntegerOrBytes value;
    value.integerValue = 100;
    for(int i = 0; i < sizeof(int); i += 1) {
        printf("byte[%d] = %d\n", i, value.bytes[i]);
    }
}
0 голосов
/ 30 июля 2009

printf ожидает получить число в качестве аргумента при печати чего-либо с указателем x. Вы передаете символ, поэтому он выводит значение ascii для символа. Попробуйте изменить

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

до

printf("%02x", test[i] - 0x30); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...