我目前正在解析一些MAC地址。我得到了一个不包含前导零的输出(如下所示)。
char* host = "0:25:25:0:25:25";我想这样格式化它
char* host = "00:25:25:00:25:25";做这件事最简单的方法是什么?
对于那些想知道的人,我使用的是libpcap库。
发布于 2013-01-26 15:26:18
我可能在问题中遗漏了一些东西。假设您知道它是一个有效的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:",":n:"的"0:"":n"的":0:"":A:"值。再一次,在与上面(1)相同的条件下。示例:读取时":0"":b";它同时适用于大写和小写数字字符。发布于 2013-01-26 15:23:49
大致如下:分配一个输出字符串来保存重新格式化的MAC地址。迭代输入字符串并使用带有:分隔符的strtok。在每次迭代中,将字符串的开头(2字节)转换为数值(例如,使用atoi)。如果结果< 16 (即< 0x10),则在当前位置将"0"设置为输出字符串,并在下一位置将结果设置为十六进制;否则复制输入字符串的2个字节。将:追加到输出字符串。继续,直到输入结束。
https://stackoverflow.com/questions/14534780
复制相似问题