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

在C语言中转换MAC地址的字符串操作,c,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,

我有
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;
}

在我看来,这就像是
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”的小数

#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;
}
如果
ss.tt.uu.vv
的第一个字段是
cc
的十进制等价物,第二个字段是
dd
的十进制等价物,则:

  • bb
    ee
    去哪里
  • uu
    vv
    是十六进制还是十进制
假设你真正想要的是:

  • MAC
    中的第二、第三、第四和第五个十六进制字段转换为整数
  • 将结果显示为
    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);
}

strtok()
snprintf()
@user95711-值得一试-可能会学到一些东西。我可以将它们拆分,但不知道如何将它们转换为小数合并到scanf以将字符串转换为小数。但是如何存储这些“标记”这就是我要找的…实际上99是错误的,ss.tt.uu.vv只是示例,实际值和它之间没有联系(这些都是用点分隔的小数)。因为我是C语言的新手,所以我不能告诉你我想用字符串做什么。对不起。