Convert char* to uint8_t

后端 未结 4 710
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-18 02:30

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 ui

相关标签:
4条回答
  • 2020-12-18 02:45

    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 :/

    0 讨论(0)
  • 2020-12-18 02:52

    char * is a pointer, not a single character. It is possible that it points to the character you want.

    uint8_t is unsigned but on most systems will be the same size as a char and you can simply cast the value.

    You may need to manage the memory and lifetime of what your function returns. This could be done with vector< unsigned char> as the return type of your function rather than char *, especially if toUtf8() has to create the memory for the data.

    Your question is totally ambiguous.

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

    That is a lot of cascading calls. We have no idea what any of them do and whether they are yours or not. It looks dangerous.

    0 讨论(0)
  • 2020-12-18 02:57

    More safe example in C++ way

    char* bufferSlidePressure = "123";
    std::string buffer(bufferSlidePressure);
    std::stringstream stream;
    
    stream << str;
    int n = 0;
    
    // convert to int
    if (!(stream >> n)){
        //could not convert
    }
    

    Also, if boost is availabe

    int n = boost::lexical_cast<int>( str )
    
    0 讨论(0)
  • 2020-12-18 03:02

    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
    
    0 讨论(0)
提交回复
热议问题