Конвертировать 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,

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

6

Решение

Ваша строка номер? Например. char* bufferSlidePressure = "123";?

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

uint8_t slidePressure = (uint8_t)atoi(bufferSlidePressure);

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

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

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

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

Другие решения

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

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

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

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

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

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

1

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

Кроме того, если буст доступен

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

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

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

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

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

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

Это много каскадных звонков. Мы понятия не имеем, чем занимается кто-либо из них и является ли он вашим или нет. Это выглядит опасно.

0
По вопросам рекламы [email protected]