阅读 52

C语言字符串转化为int类型,c语言整数转字符串

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

canmessage(unsigned_id,const char* _data,char _len=8) ) ) ) ) ) ) ) ) ) )。

有关详细信息,请访问: https://OS.mbed.com/docs/mbed-OS/v 5.11/mbed-OS-API-doxy/class mbed _1_1_ c _ a _ n messsssse

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

voidfoo(unsignedintid,/*?) ? */data,Charlen({

canmessage(id,data,len ) )。

}

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

载体DTA;

试着用dta[0]传递。 foo(idno,dta[0],length )。

foo函数的使用如下。

voidfoo(unsignedintid,uint8_t* data,char len ) )

canmessage(id,) char * (data,len ) ) ) ) ) ) ) ) ) canmessage(id,) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) can message。

}

但是,'类型std : uint8_t的参数与char类型的参数不兼容*

如何在调用函数foo接受uint8_t*时将其作为const char*传递?

无法更改类型。 请注意,dta必须保持为向量。

请注意,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很容易抓住。 3360--Eskey :你的代码和错误信息不一致。

我不能再现你那个例子的问题。 (缺少完整的部分。 ) coliru.stacked-crooked.com/a/1b 54a 11 a 5b 0a 341 f

@eerorika我只能用C 98 mbed编译器再现它。 我在Visual Studio上尝试了我的问题。 那很好。 没有错误。 我没有提到那个。 因为只有小型mbed环境才能在线使用它进行检查。 编译器。 我最终采取了别的方法。 我的foo函数现在正在使用char *。 (char * ) ) &; 更改为调用DTA(0)时,将其转换为char *。 因此,CANMessage只能使用foos char *。 可以解决我的问题。 幸运的是,根据迈克尔的描述,幸运的是char *只是一个缓冲区,所以强制切换应该是无害的。

std:uint8_t等于无符号字符。

这与纯文字或带符号的文字不同,但都是8位,所以技术上可以强制转换。

许多需要“缓冲区”的函数通常在定义中带有char*,而不是相应的unsigned char*。 因此,投射很可能是无害的。

如果函数实际需要字符而不是缓冲区,则会出现问题,因为它们的类型不同,而且不确定是否会出现问题。

是否需要“std:uint8_t等于unsigned char”? 合法的扩展整数型也可以吗?

如果存在@ franoisandrieuxstd :3360 uint8_ t,则unsigned char必须是无符号8比特类型。 对于CHAR_BIT 8,uint8_t不存在

如果定义了@phuclvSTD33603360uint8_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。

voidfoo(unsigned_id,const std:vector dta ) )

static_assert(char_bit==8,' Strange char ' );

CANMessage (

_id,

reinterpret_cast(DTA.data ) )、

satic_cast(DTA.size ) )

);

}

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

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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐