c 语言 uint8 转char,关于c ++:将uint8_t *更改为char *?

博客探讨了如何在C++中将uint8_t类型的向量传递给需要const char*参数的API。文章描述了在尝试使用uint8_t向量的地址直接调用API时遇到的类型不兼容问题,并提供了使用reinterpret_cast和static_cast解决此问题的方法。同时,讨论了在C++中char和uint8_t之间的关系以及在不同环境下的强制转换安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个请求char*的API,这是我的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 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。

请注意,char可能是signed或unsigned(取决于您的实现),并且在两种情况下char是signed char和unsigned char的不同类型。

通常,您应该将任何C样式强制转换都视为危险标志,表示您做错了什么。

至于您的问题,能否请您复制并粘贴完整和*完整的错误输出,包括任何可能的信息性注释。

请提供MCVE。通常,投射到const char *应该没有问题。

你为什么不尝试CANMessage(id, reintepret_cast(&data[0]), len)。实际上,char和uint8_t数据类型之间没有二进制差异。两者都是8位,因此如果使用字符数组或某些RGBA像素图,则强制转换是安全的。如果您使用整数值,这是没有道理的,即您最好使用if(a[i] > b[i])之类的东西而不进行转换。

reinterpret_cast(dta.data())和static_cast(dta.size())可以做到。

什么是uint_8?

@Eljay好抓住。 :-) Eskey:您的代码与错误消息不匹配。

我无法重现您的示例的问题(缺少完整的部分):coliru.stacked-crooked.com/a/1b54a11a5b0a341f

@eerorika我只能在C ++ 98 mbed编译器中重现它,我在Visual Studio中尝试了我的问题,它很好,没有错误,我没有提到它,因为只有小型mbed环境可以在线使用它进行检查。编译器。我最终采取了另一种方法,我的foo函数现在使用了char *,当我改为调用(char *)&dta [0]时,我将其转换为char *。因此,CANMessage可以仅使用foos char *。我能够解决我的问题,幸运的是,根据迈克尔斯的解释,幸运的是char *只是一个缓冲区,因此强制转换应该是无害的。

std::uint8_t等于unsigned char。

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

通常,许多本来需要"缓冲区"的函数在其定义中都带有char*而不是适当的unsigned char*。 因此,投射很可能是无害的。

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

" std::uint8_t等于unsigned char"是否需要?合法地可以是扩展整数类型吗?

@FranoisAndrieux如果存在std::uint8_t,则unsigned char必须为无符号8位类型。如果CHAR_BIT > 8,则uint8_t无法存在

@phuclv我同意如果定义了std::uint8_t,则必然unsigned char是它的兼容候选对象。我想知道的是,是否要求std::uint8_t实际上是unsigned char。我不明白为什么即使提供了另一个unsigned 8位整数类型,实现也不会这样做。您最好将其定义为unsigned char,但是我不确定是否必须这样做。

std::uint8_t是已定义类型,unsigned char是内置类型。必须以内置类型的方式以某种方式定义已定义的类型。如果不使用unsigned char,还可以使用什么?

@MichaelChourdakis可以是扩展整数类型,它们可以用作基本整数类型。例如,由于我无法想象的原因,我的编译器可能具有__unsigned_byte类型或其他内容。编辑:自C ++ 20起,还有char8_t具有与unsigned char相同的大小,符号和对齐方式。

@MichaelChourdakis好吧,我明白了。它必须是一个缓冲区,因为我已经成功地使用了can协议来强制转换为char以发送消息。 API最好是unsigned char *,不幸的是,不是这种情况。

@FranoisAndrieux没有8位char类型,但是具有固定宽度的8位扩展int类型将有些奇怪。但是,是的,这似乎合法。

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

将uint8_t*重新解释为const char*,并将向量的大小(size_t)静态转换为char。

void foo(unsigned _id, const std::vector& dta) {

static_assert(CHAR_BIT == 8,"Strange char");

CANMessage(

_id,

reinterpret_cast(dta.data()),

static_cast(dta.size())

);

}

C和C ++都要求char的所有形式至少为8位。这来自中CHAR_BIT的定义,该定义通过进入C ++。

@PeteBecker我不知道char本人少于8位的任何系统,但是这里有很多其他讨论都提到6位和7位char历史机器。也许可以忽略今天的那些内容:-) ...但是,即使uint8_t和char都具有8位-它们不一定像Franois Andrieux所指出的那样是位兼容的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值