将char *转换为uint8_t

时间:2014-08-18 10:13:51

标签: c++ char data-conversion uint8t

我通过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 个答案:

答案 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 )