将uint8_t *更改为char *?

时间:2019-05-15 14:31:45

标签: c++ c casting signed unsigned-char

我有一个请求sort的API,这是我的API函数:

char*

此处提供更多信息:https://os.mbed.com/docs/mbed-os/v5.11/mbed-os-api-doxy/classmbed_1_1_c_a_n_message.html

我想从另一个函数中调用此函数,但是我对CANMessage(unsigned _id, const char* _data, char _len = 8) 和强制转换感到困惑。我想从函数const char*调用此函数,如下所示:

foo()

所以我需要将id,data和len传递给foo函数。我的问题是进入的void foo(unsigned int id, /*???*/ data, char len) { CANMessage(id, data, len) } data类型。我得到了uint8_t的向量,其中第一个元素的地址是我需要传递的地址:

uint8_t

我试图以vector<uint8_t> dta; 的身份通过:&dta[0]

具有foo函数:

foo(idNo, &dta[0], length)

但是我得到“类型为std :: uint8_t的参数与char类型的参数不兼容

调用函数void foo(unsigned int id, uint8_t* data, char len) { CANMessage(id, (char*)data, len) } 接受const char*时,如何将其作为foo传递?

请注意,我无法更改类型,dta必须保留uint8_t*

2 个答案:

答案 0 :(得分:2)

std::uint8_t等于unsigned char

这与纯字符或带符号的字符不同,但是它们都是8位,因此在技术上可以强制转换。

通常许多其他需要“缓冲区”的函数在其定义中都使用char*而不是适当的unsigned char*。因此,投射很可能是无害的。

在函数实际上需要字符而不是缓冲区的情况下,由于类型不同,您会遇到问题,并且不确定是否会出现问题。

答案 1 :(得分:1)

由于您处于std::uint8_t可用的环境中,因此char类型必须最多为8位,但是为了确保您使用的不是7位字符的机器,请添加一个static_assert

reinterpret_castuint8_t*的{​​{1}}和static_castconst char*的向量的大小(size_t)。

char