Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert char* to uint8_t

I transfer message trough a CAN protocol.

To do so, the CAN message needs data of uint8_t type. So I need to convert my char* to uint8_t. With my research on this site, I produce this code :

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

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

As you may see, my char* must fit in sliderPressure[0].

My problem is that even if I have no error during compilation, the data in slidePressure are totally incorrect. Indeed, I test it with a char* = 0 and I 've got unknow characters ... So I think the problem must come from conversion.

My datas can be Bool, Uchar, Ushort and float.

Thanks for your help.

like image 956
Evans Belloeil Avatar asked Aug 18 '14 10:08

Evans Belloeil


Video Answer


2 Answers

Is your string an integer? E.g. char* bufferSlidePressure = "123";?

If so, I would simply do:

uint8_t slidePressure = (uint8_t)atoi(bufferSlidePressure);

Or, if you need to put it in an array:

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

Edit: Following your comment, if your data could be anything, I guess you would have to copy it into the buffer of the new data type. E.g. something like:

/* 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
like image 59
Carmellose Avatar answered Sep 19 '22 07:09

Carmellose


uint8_t is 8 bits of memory, and can store values from 0 to 255

char is probably 8 bits of memory

char * is probably 32 or 64 bits of memory containing the address of a different place in memory in which there is a char

First, make sure you don't try to put the memory address (the char *) into the uint8 - put what it points to in:

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

Then work out what you are really trying to do ... because this isn't quite making sense. For example, a float is probably 32 or 64 bits of memory. If you think there is a float somewhere in your char * data you have a lot of explaining to do before we can help :/

like image 41
Andy Newman Avatar answered Sep 17 '22 07:09

Andy Newman