используйте sscanf для чтения шестнадцатеричного значения из строки - PullRequest
0 голосов
/ 04 апреля 2019

Я хочу прочитать шестнадцатеричное значение из строки и сохранить его в переменной, Я использую sscanf, но исходное число составляет 6 байт, и я получаю только младшие 4 байта.

это код, который я использую:

#include <stdio.h>

int main(void) {
    const char my_string[] ="\r\n0080254800DA 0x02 C\n0080254800DA 0x02 P\n9C04EB06ACA2 0x03 P";
    unsigned int a,b,c,d,e,f;
    char s1,s2,s3;
    sscanf(my_string, "\r\n%16x %X %c\n%16x %x %c\n%16x %x %c\n", &a, &b, &s1,&c,&d,&s2,&e,&f,&s3);
    printf("\r\n%#-X %#2x %c\n%#-X %#2x %c\n%#-X %#2x %c\n", a,b, s1,c,d,s2,e,f,s3);
    return 0;
}

и вот результат, который я получаю:

0X254800DA 0x2 C

0X254800DA 0x02 P

0XEB06ACA2 0x3 P

как я могу это исправить?

1 Ответ

1 голос
/ 04 апреля 2019

Полагаю, вы используете целые числа размером 32 бита.Чтобы сохранить шестнадцатеричное целое число из 12 символов, вам нужно больше, чем 32-битный тип:

#include <stdio.h>
/* this include defines [u]int[8|16|32|64]_t types */
#include <stdint.h>

int main(void) {
    const char my_string[] ="\r\n0080254800DA 0x02 C\n0080254800DA 0x02 P\n9C04EB06ACA2 0x03 P";

    /* use Unsigned INTeger on 64 bits */
    uint64_t a, b, c, d, e, f;
    char s1,s2,s3;

    /* sscanf/printf formatting need some +l to handle such types */
    sscanf(my_string, "\r\n%16lx %lX %c\n%16lx %lx %c\n%16lx %lx %c\n", &a, &b, &s1,&c,&d,&s2,&e,&f,&s3);
    printf("\r\n%#-lX %#2lx %c\n%#-lX %#2lx %c\n%#-lX %#2lx %c\n", a,b, s1,c,d,s2,e,f,s3);
    return 0;
}

Проверено на gcc-tio

...