将char*转换为uint8_t

13

我通过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和float

感谢您的帮助。


"char* = 0" 的意思是 "bufferSlidePressure == 0" 吗?如果是,那么不会转换任何数据。 - Charlie
这意味着 bufferSlidePressure = '0'。 - Evans Belloeil
请提供特定的输入和输出值。以下代码可以显示正确的值:char* buf = "0"; uint8_t slide[8]; sscanf(buf, "%c", &slide[0]); printf("%d", slide[0]); - Charlie
4个回答

13

你的字符串是一个整数吗?例如: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

可以的,但它也可以是布尔值或浮点数,这个工作方式相同吗? - Evans Belloeil
如果我理解正确的话,我可能会使用memcpy()来做一些事情(请参见我的编辑)。 - Carmellose
看起来还好,但我现在也需要有 char* :( - Evans Belloeil
@EvansBelloeil 不需要转换 :) 请查看编辑。 - Carmellose
谢谢,但我需要这个char*以uint8_t格式。编译器不接受你的答案:( 并告诉我从char *到uint8_t存在无效转换。 - Evans Belloeil
1
@EvansBelloeil,然后在我上一个示例中将char更改为uint8_t,那应该就可以了。如果您想要复制到一个uint8_t,则size=1。否则,您需要复制一系列的uint8_t。请参阅memcpy文档。 - Carmellose

2

uint8_t是8位内存,可以存储0到255之间的值。

char可能是8位内存。

char*可能是32或64位内存,其中包含另一个内存中char的地址。

首先,请确保不要尝试将内存地址(即char*)放入uint8中-请将其指向的内容放入其中:

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

首先确定您真正想要做什么...因为这样说并不太合理。例如,浮点数可能是32位或64位的内存。如果您认为在char * data中有一个浮点数,那么在我们能够帮助您之前,您需要解释很多内容 :/


0

char * 是指针,而不是单个字符。它可能指向你想要的字符。

uint8_t 是无符号的,但在大多数系统上它与char大小相同,您可以简单地将值进行强制类型转换。

您可能需要管理函数返回的内容的内存和生命周期。特别是如果toUtf8()必须为数据创建内存,则可以使用vector< unsigned char>作为您函数的返回类型,而不是char *

你的问题完全不明确。

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

这是很多级联调用。我们不知道它们都是做什么的,也不知道它们是不是你写的。看起来很危险。


转换不起作用 :( uint8_t slidePressure = (uint8_t) bufferSlidePressure; - Evans Belloeil
不,你可以将数据转换为所需类型,但是完全无法确定你试图做什么。 - CashCow

-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
}

另外,如果boost可用

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接