【问题标题】:Read raw bytes in argv[]读取 argv[] 中的原始字节
【发布时间】:2018-11-24 09:00:06
【问题描述】:

我想知道是否有办法从 C 中的命令行读取字节(例如:\x00\x01\x02)。

例如:

#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("%s", argv[1]);
  return 0;
}
user@UbuntuServer: ~/Code# gcc Program.c -o Program 
user@UbuntuServer: ~/Code# ./Program "\x48\x69"

Hiuser@UbuntuServer: ~/Code# ./Program "\x48\x69\x0a"

Hi
user@UbuntuServer: ~/Code#

谢谢!

【问题讨论】:

  • 试试例如printf("%02hhx\n", argv[1][0]);
  • @Someprogrammerdude 看看 OPs 的输入,这不会削减它。
  • 请阅读how to ask good questions,以及this question checklist。然后编辑您的问题,向我们展示您希望从您提供的“输入”中获得什么输出。
  • 所有三个输入都需要...第一个输入或包含gcc 的输入正在编译,第二个显示正在将\x48\x69 打印到终端,但请注意那里最后没有换行符吗?这就是第三个输入发挥作用的地方,表明通过添加 0A 或换行符,它也会打印一个换行符。

标签: c byte command-line-arguments


【解决方案1】:

除非您使用库来解析这样的正则表达式字符串,否则您需要手动解析十六进制。查看这个答案(语法略有不同但功能相似):

Hexadecimal string to byte array in C

【讨论】:

  • 那应该是一条评论。
  • 是的,但在获得 50 声望之前我无法发表评论。我猜可能应该让其他人回答它......
  • 没有考虑代表和能够发表评论。我也不知道在这种情况下该怎么做最好。给你一些,希望对你有帮助;)
  • 一般来说,在您有足够的代表发表评论之前,最好不要产生包含评论的“不是答案”。这很可能会被否决,这意味着需要更长的时间才能发表评论。在这种情况下,似乎有足够多的人同意您的观点,即您现在已获得评论特权
  • @Paul 开心评论 :)
【解决方案2】:

我会选择这样的:

int main(int argc, char **argv)
{
    char *buf = malloc(strlen(argv[1]) / 4 + 1);
    size_t i = 0;
    for (char *tok = strtok(argv[1], "\\x"); tok; tok = strtok(NULL, "\\x"))
    {
        sscanf(tok, "%02hhx", buf + i);
        i++;
    }
    buf[i] = '\0';
    printf("%s", buf);
    free(buf);
    return 0;
}

【讨论】:

    【解决方案3】:

    我在 this 线程上找到了 HEX 到 ASCII 的转换函数,并对其进行了修改以适应我的情况。

    #include <stdio.h>
    #include <string.h>
    
    int hexToInt(char c) {
      int first = c / 16 - 3;
      int second = c % 16;
      int result = first * 10 + second;
      if(result > 9) {
        result--;
      }
      return result;
    }
    
    int hexToASCII(char c, char d) {
      int high = hexToInt(c) * 16;
      int low = hexToInt(d);
      return high + low;
    }
    
    int main(int argc, char *argv[]) {
      char* hexString = argv[1];
      char buf = 0;
      for(int i = 0; i < strlen(hexString); i++) {
        if(i % 2 != 0) {
          printf("%c", hexToASCII(buf, hexString[i]));
        } else {
          buf = hexString[i];
        }
      }
      return 0;
    }
    

    【讨论】:

    • 一个观察:假设字母十六进制数字是大写的;它不能正确处理小写字母。这是将数字0..9 和字母A..F 转换为十六进制的有趣方式。算法不明显。不幸的是,由于它不进行任何验证,所以它不是很有弹性——我不推荐它用于一般用途,尽管给出有效数据,它确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2023-02-22
    相关资源
    最近更新 更多