C中的字符串操作转换MAC地址

时间:2013-02-23 06:17:38

标签: c

我有char *MAC="aa:bb:cc:dd:ee:ff:99"。 在此字符串中,所有值均为“十六进制”格式。

如何将其存储到另一个字符串中并删除前两个数字,最后四个数字应如下所示: "ss.ttt.uu.vv"

这里ss是“cc”的十进制数,ttt同样是“dd”的十进制数。

#define DELIM ":"
int tok(char *str_to_tokenize)
{
 // char str_to_tokenize[] = "- Strtok is meant for - breaking up, strings with funny values. + 5";
  char *str_ptr;

  fprintf(stdout, "Split \"%s\" into tokens:\n", str_to_tokenize);

  str_ptr = strtok(str_to_tokenize, DELIM);
  for(; str_ptr != NULL ;){
    fprintf(stdout, "%s\n", str_ptr);
    str_ptr = strtok(NULL, DELIM);
  }

  return 0;
}

int main()
{
  char* buffer="aa:bb:c:dd:ee:ff:gg";
  tok(buffer);
  return 0;
}

1 个答案:

答案 0 :(得分:2)

对我来说,sscanf()snprintf()似乎是一个案例。但是,问题很混乱:

  

我有char *MAC="aa:bb:cc:dd:ee:ff:99"。在此字符串中,所有值均为“十六进制”格式。

     

我如何[...]删除前两个数字和后四个数字:“ss.ttt.uu.vv”。

您在计算数字还是数字?如果您正在计算数字,则删除前两个意味着'aa'和'bb'被忽略,删除最后四个意味着'dd','ee','ff'和'99'也会被忽略。如果您正在计算数字,则忽略'aa','ff'和'99',将4个数字(8位)格式化为4部分虚线数字。总的来说,计算数字更有意义。

然后你说:

  

这里ss是“cc”的十进制数,ttt同样是“dd”的十进制数。

如果ss.tt.uu.vv的第一个字段是cc的十进制等值,第二个字段是dd的十进制等值,那么:

  • bbee去哪儿了?
  • uuvv是十六进制还是小数?

假设你真正追求的是:

  • MAC中的第2,第3,第4和第5个十六进制字段转换为整数。
  • 将结果显示为sss.ttt.uuu.vvv,并使用原始顺序中十六进制值的十进制等值。

这可以实现为:

#include <stdio.h>

int main(void)
{
    int bb, cc, dd, ee;
    const char *MAC = "aa:bb:cc:dd:ee:ff:99";
    char output[16] = "";

    if (sscanf(MAC, "%*x:%x:%x:%x:%x:", &bb, &cc, &dd, &ee) == 4)
        snprintf(output, sizeof(output), "%d.%d.%d.%d", bb, cc, dd, ee);

    printf("MAC = %s; result = %s\n", MAC, output);
    return(0);
}

%*x转换规范意味着'读取十六进制整数并且不将其分配给变量'。

示例输出:

MAC = aa:bb:cc:dd:ee:ff:99; result = 187.204.221.238