将 uint8_t* 更改为 char*?

Change uint8_t* to char*?

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

CANMessage(unsigned _id,  const char* _data, char _len = 8)

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

我想从另一个函数中调用此函数,但我对 const char* 和转换感到困惑。我想从函数 foo() 中调用此函数,如下所示:

void foo(unsigned int id, /*???*/ data, char len) {
    CANMessage(id, data, len)
}

所以我需要将 id、data 和 len 传递给函数 foo。我的问题是进来的 datauint8_t 类型。我得到了一个uint8_t的向量,其中第一个元素的地址是我需要传递的地址:

vector<uint8_t> dta;

我试图将其传递为 &dta[0]foo(idNo, &dta[0], length)

foo 函数如下:

void foo(unsigned int id, uint8_t* data, char len) {
    CANMessage(id, (char*)data, len)
}

但是我得到“std::uint8_t * 类型的参数与 char*

类型的参数不兼容

当调用它的函数 foo 接受 uint8_t* 时,如何将它作为 const char* 传递?

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

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

reinterpret_cast the uint8_t* to const char* and static_cast char.

向量的大小 (size_t)
void foo(unsigned _id, const std::vector<uint8_t>& dta) {
    static_assert(CHAR_BIT == 8, "Strange char");

    CANMessage(
        _id,
        reinterpret_cast<const char*>(dta.data()),
        static_cast<char>(dta.size())
    );
}

std::uint8_t等于unsigned char.

这不同于普通 char 或 signed char,但它们都是 8 位的,因此转换在技术上是可行的。

许多原本需要 "buffer" 的函数在其定义中使用 char* 而不是正确的 unsigned char* 是很常见的。因此,铸造很可能是无害的。

如果函数实际上需要字符而不是缓冲区,那么你就会遇到问题,因为类型不同,你是否会遇到问题是不确定的。