C - 格式化MAC地址

时间:2013-01-26 07:15:54

标签: c formatting

我目前正在解析一些MAC地址。我得到的输出不包括前导零(如此)。

char* host = "0:25:25:0:25:25";

我想像这样格式化

char* host = "00:25:25:00:25:25";

最简单的方法是什么?

对于那些想知道的人,我正在使用libpcap库。

2 个答案:

答案 0 :(得分:4)

我可能在问题中遗漏了一些东西。假设你知道它是一个有效的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全部&lt; 255,这可能是优选的。我认为性能不是关键问题的根本原因是你可能没有在你的问题中考虑的许多事情。它处理所有

  1. "n:"的潜在客户价值,其中n任何十六进制数字;不仅仅是零。示例:"5:""0:"
  2. ":n:"的中间值,再次与上述(1)相同。示例:":A:"":0:"
  3. ":n"的尾值。再次,在与上述(1)相同的条件下。示例:":b"":0"
  4. 阅读时六位数不可知;它适用于大写和小写数字字符。
  5. 最重要的是,如果您的输入字符串格式正确,则不执行任何操作(除了大写十六进制值)。

答案 1 :(得分:0)

大致相同: 分配输出字符串以保存重新格式化的MAC地址。 迭代输入字符串并使用带有strtok分隔符的:。在每次迭代中,将字符串的开头(2个字节)转换为数值(例如,使用atoi)。如果结果&lt;如图16所示(即&lt; 0x10),将"0"设置为当前位置的输出字符串,并将结果设置为以下位置的十六进制;否则复制输入字符串的2个字节。将:附加到输出字符串。继续直到输入结束。