将 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。我的问题是进来的 data
是 uint8_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*
是很常见的。因此,铸造很可能是无害的。
如果函数实际上需要字符而不是缓冲区,那么你就会遇到问题,因为类型不同,你是否会遇到问题是不确定的。
我有一个 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。我的问题是进来的 data
是 uint8_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*
是很常见的。因此,铸造很可能是无害的。
如果函数实际上需要字符而不是缓冲区,那么你就会遇到问题,因为类型不同,你是否会遇到问题是不确定的。