Получение шестнадцатеричного числа в программе через командную строку - PullRequest
7 голосов
/ 29 января 2010

Я могу сделать это:

int main(int argc, char** argv) {
  unsigned char cTest = 0xff;
  return 0;
}

Но как правильно ввести шестнадцатеричное число в программу через командную строку?

unsigned char cTest = argv[1];

не добивается цели. Это приводит к инициализации делает целое число из указателя без приведения предупреждение.

Ответы [ 6 ]

14 голосов
/ 16 июля 2011

Я думаю, что некоторые люди, приезжающие сюда, могут просто искать:

$ ./prog `python -c 'print "\x41\x42\x43"'`
$ ./prog `perl -e 'print "\x41\x42\x43"'`
$ ./prog `ruby -e 'print "\x41\x42\x43"'`
7 голосов
/ 29 января 2010
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  printf("%ld\n", strtol(argv[1], NULL, 16));

  return 0;
}

Пример использования:

$ ./hex ff
255
7 голосов
/ 29 января 2010

Вы можете использовать strtoul , который будет проходить через символы в строке и преобразовывать их, принимая во внимание основание (16 в этом контексте), которое вы передаете: -

char *terminatedAt;
if (argc != 2)
    return 1;

unsigned long value = strtoul( argv[1], &terminatedAt, 16);

if (*terminatedAt != '\0')
    return 2;

if (value > UCHAR_MAX)
    return 3;

unsigned char byte = (unsigned char)value;
printf( "value entered was: %d", byte);

Как описано в других примерах, есть более короткие способы, но ни один из них не позволяет вам чисто проверить ошибку на обработку (что происходит, если кто-то передает FFF, а у вас есть только unsiged char, чтобы поместить его в

например. с sscanf:

int val;
sscanf(argv[1], &val)
printf("%d\n", val); 
4 голосов
/ 29 января 2010
unsigned char cTest = argv[1];

неверно, потому что argv[1] имеет тип char *. Если argv[1] содержит что-то вроде "0xff" и вы хотите присвоить целочисленное значение, соответствующее этому значению, unsigned char, то, вероятно, проще всего было бы использовать strtoul(), чтобы сначала преобразовать его в unsigned long, а затем проверьте, является ли преобразованное значение меньше или равным UCHAR_MAX. Если да, вы можете просто присвоить cTest.

Третий параметр

strtoul() является основанием, которое может быть 0 для обозначения разбора числа в стиле C (допускаются восьмеричные и шестнадцатеричные литералы). Если вы хотите разрешить только основание 16, передайте это в качестве третьего аргумента strtoul(). Если вы хотите разрешить любую базу (чтобы вы могли анализировать 0xff, 0377, 255 и т. Д.), Используйте 0.

UCHAR_MAX определено в <limits.h>.

1 голос
/ 29 января 2010

Традиционный способ сделать это в C - это scanf () . Это как раз обратная функция printf (), которая читает заданный формат из файла (или терминала) в перечисленные вами переменные, а не записывает их в него.

В вашем случае вы бы использовали sscanf, поскольку вы уже получили его в виде строки, а не потока.

0 голосов
/ 29 января 2010

atoi, atol, strtoi, strtol

все в stdlib.h

...