加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

将unsigned char *(uint8_t *)转换为const char *

发布时间:2020-12-14 04:30:55 所属栏目:Windows 来源:网络整理
导读:我有一个函数,它接受一个uint8_t *参数: uint8_t* ihex_decode(uint8_t *in,size_t len,uint8_t *out){ uint8_t i,hn,ln; for (i = 0; i len; i+=2) { hn = in[i] '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0'; ln = in[i+1] '9' ? (in[i+1]|32) - 'a' + 10
我有一个函数,它接受一个uint8_t *参数:

uint8_t* ihex_decode(uint8_t *in,size_t len,uint8_t *out)
{
    uint8_t i,hn,ln;

    for (i = 0; i < len; i+=2) {
        hn = in[i] > '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0';
        ln = in[i+1] > '9' ? (in[i+1]|32) - 'a' + 10 : in[i+1] - '0';

        out[i/2] = (hn << 4 ) | ln;
    }

    return out;
}

我用这个函数:

uint8_t data[SPM_PAGESIZE]; // SPM_PAGESIZE = 256 bytes
uint8_t sysex_data[SPM_PAGESIZE/2];
ihex_decode(data,strlen(data),sysex_data);

但在这种情况下,我的编译器(avr-gcc)会返回一个警告:

main.c|89|warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness
/usr/include/string.h|399|note: expected ‘const char *’ but argument is of type ‘uint8_t *’

所以,我通过类型转换数据var找到了一个解决方案:

ihex_decode(data,strlen((const char *)data),sysex_data);

警告消失但我想知道这个解决方案是否安全.

有没有更好的办法 ?

谢谢

解决方法

这很安全.该错误与将8位的无符号整数与字符混合有关,如果仅使用char,则会对其进行签名.

但是,我看到该函数接受uint8_t并进行字符算术,所以它应该接受字符(或const char,就此而言).请注意,字符常量’c’的类型为char,并且您在ihex_decode中的表达式中混合有符号和无符号,因此您必须小心避免溢出或负数被视为大正数.

最后的风格笔记.因为未修改,它应该在参数中读取const uint8_t * in(或const char * in,如上所述).另一个样式错误(可能导致非常糟糕的错误)是你接受len作为size_t,但是将i循环变量声明为uint8_t.如果字符串长度超过255个字节怎么办?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读