gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:27:30 25 4
gpt4 key购买 nike

我有一个接受 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 并执行 character 算术,因此它应该接受 char(或 const chars,就此而言)。请注意,字符常量 'c' 的类型为 char,并且您在 ihex_decode 中的表达式中混合了有符号和无符号,因此您必须小心避免溢出或将负数视为大正数。

最后的样式说明。由于 in 没有被修改,它应该读取参数中的 const uint8_t* in(或 const char* in,如上所述)。另一个样式错误(可能导致非常严重的错误)是您接受 len 作为 size_t,但将 i 循环变量声明为 uint8_t。如果字符串长度超过 255 个字节怎么办?

关于将 unsigned char * (uint8_t *) 转换为 const char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7009231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com