2013-02-23 35 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