将unsigned char *(uint8_t *)转换为const char *
我有一个函数,它接受一个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)会返回一个警告:
所以,我通过类型转换数据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个字节怎么办? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Windows命令中处理扩展字符?
- 【你好,windows】Win10 x64 1709 X64企业G纯净版2019.7.28
- .net – 如何使DLL引用其他版本的第二个DLL?
- Windows使用哪些设置来确定网络位置?
- Windows 7安装Adobe Reader和Flash更新的权限?
- 在Windows 10中运行时,我的vs2013应用程序的字体模糊
- windows-8 – Win8作为自适应/辅助技术的平台
- winforms – windows窗体:带有历史记录的文本框
- windows-runtime – 如何显示UIElement但没有UI交互(触摸,点
- windows-phone-8 – 如何在Windows Phone 8应用程序中启动新