【发布时间】:2013-12-31 11:20:13
【问题描述】:
如何将字符串中的 MAC 地址转换为 C 中的整数数组?
例如,我有以下存储 MAC 地址的字符串:
00:0d:3f:cd:02:5f
如何将其转换为:
uint8_t array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}
【问题讨论】:
如何将字符串中的 MAC 地址转换为 C 中的整数数组?
例如,我有以下存储 MAC 地址的字符串:
00:0d:3f:cd:02:5f
如何将其转换为:
uint8_t array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}
【问题讨论】:
uint8_t bytes[6];
int values[6];
int i;
if( 6 == sscanf( mac, "%x:%x:%x:%x:%x:%x%*c",
&values[0], &values[1], &values[2],
&values[3], &values[4], &values[5] ) )
{
/* convert to uint8_t */
for( i = 0; i < 6; ++i )
bytes[i] = (uint8_t) values[i];
}
else
{
/* invalid mac */
}
[编辑:根据 D Krueger 的建议,在格式字符串末尾添加 %c 以拒绝输入中的多余字符。]
【讨论】:
%hhx而不是%x来避免for()循环。这将使得在sscanf() 中用bytes[] 替换values[] 成为可能。我还认为您需要一些存储空间来存储最终的%c。
%*c,这样它就不会尝试将转换结果存储在任何地方。
这是我考虑使用类似 sscanf() 来解析字符串的少数几个地方之一,因为 MAC 地址的格式往往非常严格:
char str[] = "00:0d:3f:cd:02:5f";
uint8_t mac_addr[6];
if (sscanf(str, "%x:%x:%x:%x:%x:%x",
&mac_addr[0],
&mac_addr[1],
&mac_addr[2],
&mac_addr[3],
&mac_addr[4],
&mac_addr[5]) < 6)
{
fprintf(stderr, "could not parse %s\n", str);
}
【讨论】:
uint8_t,这几乎肯定不如 int 宽,这是 sscanf() 所期望的。