Преобразование беззнакового указателя на данные в структуру, содержащую целые - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь привести этот указатель данных к моему struct, а фактическое значение заполняется в структуре.

unsigned char *data = "00000001000000020000000300000004AE93KD93KD91Q830DMNE03KEkdaredgreenblueorangeyellow";

typedef struct mystruc {
    int a;
    int b;
    int c;
    int d;
} mystruc;

mystruct ms = (mystruct *)data;

printf("%i", ms->a);

Вывод:

808464432 

Я пытаюсь узнать, как заполнить a, b, c, d фактическими значениями 1, 2, 3, 4

Я бы хотел, чтобы результат был:

1

Мне также понадобится позднее получить доступ к остальным данным.

Ответы [ 2 ]

7 голосов
/ 21 января 2020

Используйте sscanf() для анализа чисел в строке.

mystruct ms;
sscanf(data, "%8d%8d%8d%8d", &ms.a, &ms.b, &ms.c, &ms.d);

%8d означает, что для анализа 8-значного десятичного поля используется int. Если это на самом деле шестнадцатеричный код, измените его на %8x.

Ваш код интерпретирует коды символов в строке как двоичное представление элементов структуры, он не анализирует его.

0 голосов
/ 21 января 2020

Ваш unsigned char имеет ширину в один байт, поэтому "00000001" будет иметь значение 3030303031 в шестнадцатеричном формате, поскольку код ASCII для '0' равен 0x30 в шестнадцатеричном формате, а ASCII для '1' равен 0x31 .

Ваш int имеет ширину 4 байта, поэтому он будет захватывать первые 4 байта data, которые будут 30303030 в шестнадцатеричном или 808464432 в десятичном виде.

Это, однако, будет работать на машине с прямым порядком байтов:

#include <stdio.h>

typedef struct mystruct {
    int a;
    int b;
    int c;
    int d;
} mystruct;

unsigned char *data = "\1\0\0\0";  // use octal numbers, not ASCII, also note the reversed order

int main(void) {
 mystruct *ms = (mystruct *)data;

 printf("%i", ms->a); // outputs: 1
}
...