我目前正在解析一些 MAC 地址。我得到一个不包括前导零的输出(像这样)。
char* host = "0:25:25:0:25:25";
我想像这样格式化它
char* host = "00:25:25:00:25:25";
解决这个问题的最简单方法是什么?
对于那些想知道的人,我正在使用 libpcap 库。
我目前正在解析一些 MAC 地址。我得到一个不包括前导零的输出(像这样)。
char* host = "0:25:25:0:25:25";
我想像这样格式化它
char* host = "00:25:25:00:25:25";
解决这个问题的最简单方法是什么?
对于那些想知道的人,我正在使用 libpcap 库。
我可能在问题中遗漏了一些东西。假设您知道它是一个有效的 MAC,并且输入字符串因此是可解析的,您是否考虑过以下简单的事情:
char* host1 = "0:25:25:0:AB:25";
char *host2 = "0:1:02:3:0a:B";
char result[19];
int a,b,c,d,e,f;
// the question sample
if (sscanf(host1, "%x:%x:%x:%x:%x:%x", &a,&b,&c,&d,&e, &f) == 6)
sprintf(result, "%02X:%02X:%02X:%02X:%02X:%02X", a,b,c,d,e,f);
printf("host1: %s\n", result);
// a more daunting sample
if (sscanf(host2, "%x:%x:%x:%x:%x:%x", &a,&b,&c,&d,&e, &f) == 6)
sprintf(result, "%02X:%02X:%02X:%02X:%02X:%02X", a,b,c,d,e,f);
printf("host2: %s\n", result);
输出
host1: 00:25:25:00:AB:25
host2: 00:01:02:03:0A:0B
显然,对于极度偏执的人,您需要确保a-f
所有值都 < 255,这可能是更可取的。在性能不是关键问题的情况下,我更喜欢这个的根本原因是您在问题中可能没有考虑到许多事情。它处理所有
"n:"
,其中n
是任何十六进制数字;不只是零。例子:"5:"
,"0:"
":n:"
,同样在与上述 (1) 相同的条件下。例子:":A:"
,":0:"
":n"
。再一次,在与上述(1)相同的条件下。例子:":b"
,":0"
大致如下:分配一个输出字符串来保存重新格式化的 MAC 地址。遍历输入字符串并使用strtok
分隔:
符。在每次迭代中,将字符串的开头(2 个字节)转换为数值(例如,with atoi
)。如果结果<16(即<0x10),则设置"0"
到当前位置的输出字符串中,并在下一个位置以十六进制的结果;否则复制输入字符串的 2 个字节。附加:
到输出字符串。继续直到输入结束。