2013-02-23 36 views
-3

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

如何将它存储到另一个字符串中,并删除前两个数字,最后四个数字应该是这样的: "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

'的strtok()','的snprintf()'。 – 2013-02-23 06:19:46

+0

@ user95711 - 这是值得你有一个bash - 可能会学到一些东西。 – 2013-02-23 06:27:36

+0

我可以将它们溢出,但不知道如何将它们转换并合并为小数点 – 2013-02-23 06:42:08

回答

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为整数。
  • 将结果显示为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 
+0

这就是我正在寻找的...实际上99是错误的,ss.tt.uu.vv仅仅是一个例子,没有真正的价值和它之间的联系(这些都是由DOT分隔的小数)。由于我在C中很新,所以我无法告诉你我想用字符串做什么。对不起。 – 2013-02-23 07:49:29