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

标签 c network-programming hex

我希望用户以以下格式输入 MAC 地址:aa:bb:cc:dd:ee:ff,然后我在代码中将其作为 argv[1] 例如。

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

我需要的是如下所示的数组:

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

有什么想法吗?

最佳答案

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

要读取十六进制数字,您可以使用 scanf ,要打印十六进制数字,您可以使用printf。要让 scanf 知道您希望它读取十六进制数字,请使用格式说明符 %x。如果您想读入 char 而不是 int,请使用修饰符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;
}

请注意,我在输入后读入了一个虚拟字符,以检查末尾是否包含垃圾内容。这对于您的用例来说可能是必要的,也可能不是。

关于c - 获取用户输入并将其存储为十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915975/

相关文章:

c - 使用 C 从文本文件中打印出数组

c - 当给定 UID 的用户不存在时,getpwuid 和 getgrgid 会导致段错误

node.js - 使本地主机端口可通过互联网访问 - NodeJS

network-programming - 多个未完成的请求

perl - 在 Perl 中处理不同基数的命令行参数

c - C中的64位十六进制到十进制

c - 解释数据表中的十六进制并使用 C 按位​​左移运算符进行转换

c - memcpy 与 C 中的赋值——应该是 memmove?

c - 阅读最后一行后调用 feof() 是否有效?

java - 在java网络编程中,有没有办法在Client端关闭的情况下保持Server端打开?