3

現在、いくつかの MAC アドレスの解析に取り組んでいます。先行ゼロを含まない出力が与えられます (そのように)。

char* host = "0:25:25:0:25:25";

そして、私はそれをそのようにフォーマットしたいと思います

char* host = "00:25:25:00:25:25";

これを行う最も簡単な方法は何ですか?

不思議に思っている人のために、私は libpcap ライブラリを使用しています。

4

2 に答える 2

4

質問に何かが欠けているかもしれません。それが有効な 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 未満であることを確認する必要があります。これはおそらく望ましいことです。パフォーマンスが重大な問題ではない場合に私がこれを好む基本的な理由は、質問で考慮していない可能性がある多くのことです。それはすべてを処理します

  1. のリード値"n:"n任意の16 進数です。ゼロだけではありません。例: "5:""0:"
  2. ":n:"上記の(1)と同じ条件下での の中間値。例: ":A:"":0:"
  3. のテール値":n"。もう一度、上記 (1) と同じ条件で。例: ":b"":0"
  4. 読み取り時の 16 進数に依存しません。大文字と小文字の両方の数字で機能します。
  5. 最も重要なことは、入力文字列が既に適切にフォーマットされている場合、何もしません (16 進値を大文字にすることを除く)。
于 2013-01-26T07:26:18.103 に答える
0

おおよそ次のようになります: 出力文字列を割り当てて、再フォーマットされた MAC アドレスを保持します。入力文字列を繰り返し処理し、区切り文字で使用strtokします。:各繰り返しで、文字列の先頭 (2 バイト) を数値に変換します (たとえば、 を使用atoi)。結果が 16 未満 (つまり、0x10 未満) の場合"0"、出力文字列の現在の位置に設定され、結果は次の位置に 16 進数で設定されます。それ以外の場合は、入力文字列の 2 バイトをコピーします。:出力文字列に追加します。入力の最後まで続行します。

于 2013-01-26T07:23:49.403 に答える