我通过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
。
感谢您的帮助。
答案 0 :(得分: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
答案 1 :(得分: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 *数据中有某个浮点数,那么在我们提供帮助之前,您需要做很多解释:/
答案 2 :(得分:0)
char *
是指针,而不是单个字符。它可能指向您想要的角色。
uint8_t
是未签名的,但在大多数系统上,其大小与char
相同,您可以简单地转换该值。
您可能需要管理函数返回的内存和生命周期。这可以使用vector< unsigned char>
作为函数的返回类型而不是char *
来完成,特别是如果toUtf8()必须为数据创建内存。
你的问题完全不明确。
ui->canDataModifiableTableWidget->item(6,3)->text().toUtf8().data();
这是很多级联调用。我们不知道他们做了什么以及他们是否属于你。它看起来很危险。
答案 3 :(得分:0)
更安全的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 )