读取argv []中的原始字节

时间:2018-11-24 09:00:06

标签: c byte command-line-arguments

我想知道是否有一种方法可以从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#

谢谢!

3 个答案:

答案 0 :(得分:2)

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

Hexadecimal string to byte array in C

答案 1 :(得分:0)

我会选择这样的东西:

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;
}

答案 2 :(得分:0)

我在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;
}