3

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

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

我想像这样格式化它

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

解决这个问题的最简单方法是什么?

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

4

2 回答 2

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所有值都 < 255,这可能是更可取的。在性能不是关键问题的情况下,我更喜欢这个的根本原因是您在问题中可能没有考虑到许多事情。它处理所有

  1. 的前导值"n:",其中n任何十六进制数字;不只是零。例子:"5:","0:"
  2. 的中间值":n:",同样在与上述 (1) 相同的条件下。例子:":A:",":0:"
  3. 的尾值":n"。再一次,在与上述(1)相同的条件下。例子:":b",":0"
  4. 阅读时与十六进制数字无关;它适用于大写和小写数字字符。
  5. 最重要的是,如果您的输入字符串已经正确格式化,则什么也不做(除了大写的十六进制值)。
于 2013-01-26T07:26:18.103 回答
0

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

于 2013-01-26T07:23:49.403 回答