Читать необработанные байты в argv [] - PullRequest
0 голосов
/ 24 ноября 2018

Мне было интересно, есть ли способ прочитать байты (например: \x00\x01\x02) из командной строки в C.

Например:

#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 голосов
/ 24 ноября 2018

Я бы пошел на что-то вроде этого:

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;
}
0 голосов
/ 24 ноября 2018

Я нашел функции преобразования 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 голосов
/ 24 ноября 2018

Если вы не используете библиотеку для разбора строк регулярных выражений, вам нужно будет проанализировать гекс вручную.Проверьте этот ответ (который имеет немного другой синтаксис, но похожую функцию):

Шестнадцатеричная строка в байтовом массиве в C

...