2015-06-17 5 views
1

У меня есть шестнадцатеричная строка, такая как 00133587a1bddb8dae00a3a01a010100, которая на самом деле 7 шестнадцатеричных строк, конкатенированных, которые при расширении выглядят так: 00 133587a1 bddb8dae 00a3a01a 01 01 00. Я пытаюсь сканировать первые 5 из этих значений в эту структуруЗначения сканирования шестнадцатеричной строки

typedef struct __param_value{ 
    uint8_t sytem_id; 
    uint8_t comp_id; 
    uint16_t seq; 
    uint8_t frame; 
    uint16_t command; 
    uint8_t current; 
    uint8_t autocontinue; 
    float param1; 
    float param2; 
    float param3; 
    float param4; 
    float x;//param7 
    float y;//param8 
    float z;//param9 
    uint8_t fwt; 

}param_value 

и последний 2 в эти переменные

int txtseq; 
    int cont=1; 

с использованием sscanf, как это

sscanf(in_str,"%2x%8x%8x%8x%2x%2x%2x",&(points[wp].seq),&(points[wp].x),&(points[wp].y),&(points[wp].z),&(points[wp].fwt),&txtseq,&cont); 

но Я не могу понять правильный синтаксис. Можно ли это сделать так?

+0

Что значит «Я не могу понять правильный синтаксис»? Вы получаете сообщение об ошибке? Если да, то какое именно сообщение об ошибке? Как объявляются «точки»? –

+0

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

+0

Также обратите внимание, что 'x' для' unsigned int '. –

ответ

1

Вы должны передать адрес unsigned int для сканирования данных для спецификатора формата %x. Затем вы можете преобразовать в правильный тип данных.

#include <stdio.h> 

typedef unsigned char uint8_t; 
typedef unsigned short uint16_t; 

typedef struct param_value{ 
    uint8_t sytem_id; 
    uint8_t comp_id; 
    uint16_t seq; 
    uint8_t frame; 
    uint16_t command; 
    uint8_t current; 
    uint8_t autocontinue; 
    float param1; 
    float param2; 
    float param3; 
    float param4; 
    float x;//param7 
    float y;//param8 
    float z;//param9 
    uint8_t fwt; 
}param_value; 

int main(void) { 
    char hexstr [] = "00133587a1bddb8dae00a3a01a010100"; 
    unsigned v1, v2, v3, v4, v5, v6, v7; 
    param_value rec; 
    int txtseq; 
    int cont; 

    if (7 != sscanf(hexstr, "%2x%8x%8x%8x%2x%2x%2x", &v1, &v2, &v3, &v4, &v5, &v6, &v7)) 
    { 
     printf ("Bad scan\n"); 
     return 1; 
    } 

    rec.seq = (uint16_t)v1; 
    rec.x = (float)v2; 
    rec.y = (float)v3; 
    rec.z = (float)v4; 
    rec.fwt = (uint8_t)v5; 
    txtseq = (int)v6; 
    cont = (int)v7; 

    printf("%u %f %f %f %u %d %d\n", rec.seq, rec.x, rec.y, rec.z, 
            rec.fwt, txtseq, cont); 
    return 0; 
} 

выход программы:

0 322275232.000000 3185282560.000000 10723354.000000 1 1 0 

Но вы не упомянули значение bddb8daey предназначено ли быть отрицательным.

+0

Вы можете пропустить первые typedefs с '#include ' –

+0

@EugeniuRosca MSVC не имеет 'stdint.h' или тех типов, которые определены где-либо еще. –

+0

вопрос отмечен только тегом 'c': D. В любом случае, нет проблемы в вашем примере. +1. –

Смежные вопросы