11

通过 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 中的数据也是完全不正确的。确实,我用 a 测试它char* = 0并且我有未知字符......所以我认为问题必须来自转换。

我的数据可以Bool, Uchar, Ushort and float

谢谢你的帮助。

4

4 回答 4

12

你的字符串是整数吗?例如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
于 2014-08-18T10:19:00.973 回答
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 * 数据中某处存在浮点数,那么在我们提供帮助之前,您需要做很多解释:/

于 2014-08-18T13:56:36.253 回答
0

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

uint8_t是无符号的,但在大多数系统上将与 a 大小相同char,您可以简单地转换该值。

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

你的问题完全模棱两可。

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

这是很多级联调用。我们不知道他们中的任何一个人做了什么,也不知道他们是否属于你。看起来很危险。

于 2014-08-18T10:20:04.797 回答
-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 )
于 2014-08-18T10:34:47.090 回答