gpt4 book ai didi

c - sscanf 1 字节十六进制数据,无溢出

转载 作者:太空狗 更新时间:2023-10-29 17:16:06 25 4
gpt4 key购买 nike

我需要扫描 6 字节数据的十六进制表示并将其存储在 6 字节数组中。

请注意我在嵌入式系统中,所以每个字节都很重要。

以这种方式使用 sscanf :

uint8_t buf[6];
char hex[13] = "123456789ABC";
sscanf(hex, "%02X%02X%02X%02X%02X%02X", &buf[0], &buf[1], &buf[2], &buf[3], &buf[4], &buf[5]);

溢出,因为每个 %02X 说明符都加载到 uint32_t 中。

  • %02lX 将加载 uint32_t
  • %02hX 将加载 uint16_t

uint8_t 中是否有加载说明符? (我到处都找不到)

还有其他方法吗?

我试过:

sscanf(hex, "%08lX%04hX", &buf[0], &buf[4]);

这不会溢出,但是因为我在小端结构上,所以顺序困惑了......

最佳答案

Please note I am in an embedded system so every byte count.

如果是这种情况,那么 sscanf 可能是不明智的;它的堆栈使用和代码空间将使您在使用尽可能小的数据类型时可能感觉到的任何节省相形见war。考虑:

uint8_t hexdigit( char hex )
{
return (hex <= '9') ? hex - '0' :
toupper(hex) - 'A' + 10 ;
}

uint8_t hexbyte( const char* hex )
{
return (hexdigit(*hex) << 4) | hexdigit(*(hex+1)) ;
}

然后你的代码变成:

char hex[13] = "123456789ABC";

for( int b = 0; b < 6; b++ )
{
buf[b] = hexbyte( &hex[b * 2] ) ;
}

如果您必须使用 sscanf() 但您的库不支持 hh 格式说明符限定符(许多嵌入式或较旧的 C 库可能不支持),那么您可以使用中间整数:

char hex[13] = "123456789ABC";

for( int b = 0; b < 6; b++ )
{
unsigned byte ;

sscanf( &hex[b * 2], "%02X", &byte ) ;
buf[b] = (unit8_t)byte ;
}

关于c - sscanf 1 字节十六进制数据,无溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715766/

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