web-dev-qa-db-fra.com

Convertir le caractère * en uint8_t

Je transfère un message via un protocole CAN .

Pour ce faire, le message CAN nécessite des données de type uint8_t . Je dois donc convertir mon caractère * en uint8_t. Avec mes recherches sur ce site, je produis ce code:

    char* bufferSlidePressure = ui->canDataModifiableTableWidget->item(6,3)->text().toUtf8().data();//My char*

    /* Conversion */
    uint8_t slidePressure [8];
    sscanf(bufferSlidePressure,"%c",
        &slidePressure[0]);

Comme vous pouvez le constater, mon char* doit correspondre à sliderPressure[0].

Mon problème est que même si je n'ai aucune erreur lors de la compilation, les données dans slidePressure sont totalement incorrectes . En effet, je le teste avec un char* = 0 et j'ai des caractères inconnus ... Je pense donc que le problème doit venir de la conversion.

Mes données peuvent être Bool, Uchar, Ushort and float.

Merci de votre aide.

6
Evans Belloeil

Votre chaîne est-elle un numéro? Par exemple. char* bufferSlidePressure = "123";?

Si oui, je ferais simplement:

uint8_t slidePressure = (uint8_t)atoi(bufferSlidePressure);

Ou, si vous avez besoin de le mettre dans un tableau:

slidePressure[0] = (uint8_t)atoi(bufferSlidePressure);

Edit: Après votre commentaire, si vos données peuvent être n'importe quoi, je suppose que vous devrez les copier dans le tampon du nouveau type de données Par exemple. quelque chose comme:

/* in case you'd expect a float*/
float slidePressure;
memcpy(&slidePressure, bufferSlidePressure, sizeof(float));

/* in case you'd expect a bool*/
bool isSlidePressure;
memcpy(&isSlidePressure, bufferSlidePressure, sizeof(bool));

/*same thing for uint8_t, etc */

/* in case you'd expect char buffer, just a byte to byte copy */
char * slidePressure = new char[ size ]; // or a stack buffer 
memcpy(slidePressure, (const char*)bufferSlidePressure, size ); // no sizeof, since sizeof(char)=1
6
carmellose

uint8_t a 8 bits de mémoire et peut stocker des valeurs de 0 à 255

le caractère est probablement 8 bits de mémoire

char * correspond probablement à 32 ou 64 bits de mémoire contenant l'adresse d'un autre emplacement en mémoire dans lequel se trouve un caractère

Tout d’abord, assurez-vous de ne pas mettre l’adresse mémoire (le caractère *) dans le uint8 - mettez ce qui est indiqué dans:

char from;
char * pfrom = &from;
uint8_t to;
to = *pfrom;

Ensuite, déterminez ce que vous essayez réellement de faire ... parce que cela n’a pas vraiment de sens. Par exemple, un float contient probablement 32 ou 64 bits de mémoire. Si vous pensez qu'il y a un flottant quelque part dans vos données char *, vous avez beaucoup d'explications à faire avant que nous puissions vous aider: /

1
Andy Newman

char * est un pointeur, pas un seul caractère. Il est possible que cela pointe vers le personnage que vous voulez.

uint8_t est non signé, mais sur la plupart des systèmes, sa taille est identique à celle de char et vous pouvez simplement transtyper la valeur.

Vous devrez peut-être gérer la mémoire et la durée de vie de votre fonction. Cela pourrait être fait avec vector< unsigned char> comme type de retour de votre fonction plutôt que char *, surtout si toUtf8 () doit créer la mémoire pour les données.

Votre question est totalement ambiguë. 

ui->canDataModifiableTableWidget->item(6,3)->text().toUtf8().data();

C'est beaucoup d'appels en cascade. Nous n'avons aucune idée de ce qu'ils font et de ce qu'ils sont à vous ou non. Ça a l'air dangereux.

0
CashCow

Exemple plus sûr en C++

char* bufferSlidePressure = "123";
std::string buffer(bufferSlidePressure);
std::stringstream stream;

stream << str;
int n = 0;

// convert to int
if (!(stream >> n)){
    //could not convert
}

Aussi, si boost est disponible

int n = boost::lexical_cast<int>( str )
0
Yuri S. Cherkasov