Конвертировать char* в uint8 t

передать сообщение через CAN протокол.

для этого сообщение CAN нуждается в данных типа uint8_t. Поэтому мне нужно преобразовать мой char* в uint8_t. С помощью моих исследований на этом сайте я создаю этот код:

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

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

как видите, мой char* должен соответствовать sliderPressure[0].

моя проблема в том, что даже если у меня нет ошибки во время компиляции,данные в slidePressure полностью неверны. Действительно, я проверяю его с помощью char* = 0 и у меня есть неизвестные персонажи ... Поэтому я думаю, что проблема должна исходить из обращения.

мои данные могут быть Bool, Uchar, Ushort and float.

Спасибо за вашу помощь.

4 ответов


это строка номер? Е. Г. char* bufferSlidePressure = "123";?

если это так, я бы просто сделать:

uint8_t slidePressure = (uint8_t)atoi(bufferSlidePressure);

или, если вам нужно поместить его в массив:

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

Edit: после вашего комментария, если ваши данные могут быть чем угодно, я думаю, вам придется скопировать его в буфер нового типа данных. Е. Г. что-то вроде:

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

uint8_t 8 бит памяти и может хранить значения от 0 до 255

char, вероятно, 8 бит памяти

char*, вероятно, 32 или 64 бит памяти, содержащий адрес другого места в памяти, в котором есть char

во-первых, убедитесь, что вы не пытаетесь поместить адрес памяти (char *) в uint8 - поместите то, на что он указывает:

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

тогда выясните, что вы действительно пытаетесь сделать ... потому что это не совсем смысл. Например, float-это, вероятно, 32 или 64 бита памяти. Если вы думаете, что где-то в ваших данных char * есть поплавок, вам нужно многое объяснить, прежде чем мы сможем помочь :/


более безопасный пример в 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
}

кроме того, если boost доступен

int n = boost::lexical_cast<int>( str )

char * - это указатель, а не один символ. Возможно, что он указывает на персонажа, которого вы хотите.

uint8_t не имеет знака, но в большинстве систем будет иметь тот же размер, что и char и вы можете просто привести значение.

возможно, Вам потребуется управлять памятью и временем жизни того, что возвращает ваша функция. Это можно сделать с помощью vector< unsigned char> как тип возврата вашей функции, а не char *, особенно если toUtf8() должен создать память для данные.

Ваш вопрос совершенно неоднозначный.

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

это много каскадных вызовов. Мы понятия не имеем, чем они занимаются и принадлежат ли они вам. Это выглядит опасным.