获取用户输入并将其存储为十六进制

时间:2012-03-28 21:32:57

标签: c network-programming hex

我希望用户输入格式为aa:bb:cc:dd:ee:ff的MAC地址,然后我将此代码作为argv[1]添加到我的代码中。

现在如何以十六进制格式将其存储在数组中?

我需要的是这样的数组:

char temp[6] = { 0xaa,0xbb,0xcc,0xdd,0xee,0xff }

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

数组不以十六进制格式存储;十六进制格式仅适用于阅读和打印。在内部,所有数字都以二进制形式存储。

要读取十六进制数字,您可以使用scanf,要打印十六进制数字,您可以使用printf。要让scanf知道您希望它读取十六进制数字,请使用格式说明符%x。如果您想要阅读char而不是int, use the modifier hh`。以下是如何将其用于您的案例的示例:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  unsigned char addr[6];
  char dummy;

  if (argc != 2) {
    fprintf(stderr, "Wrong number of arguments\nUsage: %s ADDRESS\n",
            argv[0]);
    exit(1);
  }

  int res = sscanf(argv[1], "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx%c",
                   &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5],
                   &dummy);

  if (res == EOF) {
    fprintf(stderr, "Reached end of input without matching\n");
    exit(1);
  } else if (res < 6) {
    fprintf(stderr, "Got fewer hex digits than expected\n");
    exit(1);
  } else if (res > 6) {
    fprintf(stderr, "Got extra characters after input\n");
    exit(1);
  }

  printf("Got: %02hhx, %02hhx, %02hhx, %02hhx, %02hhx, %02hhx\n",
         addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);

  return 0;
}

请注意,我在输入后读入一个虚拟字符,以检查最后包含垃圾的输入。对于您的用例,这可能是必需的,也可能不是。

答案 1 :(得分:0)

int a, b, c, d, e, f; 

sscanf(argv[1], "%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);

使用int来获取值,然后可以将它们放在char数组中,因为它们具有字节值。

答案 2 :(得分:0)

sscanf(str, "%x:%x:%x:%x:%x:%x", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5]);