通过命令行将十六进制数字输入程序

Pie*_*ter 9 c base-conversion strtol

我可以做这个:

int main(int argc, char** argv) {
  unsigned char cTest = 0xff;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是通过命令行将十六进制数字输入程序的正确方法是什么?

unsigned char cTest = argv[1];

没有办法.这产生了一个初始化,从指针生成整数而没有强制转换警告

Pet*_*Bek 14

我想有些人到这里可能只是在寻找:

$ ./prog `python -c 'print "\x41\x42\x43"'`
$ ./prog `perl -e 'print "\x41\x42\x43"'`
$ ./prog `ruby -e 'print "\x41\x42\x43"'`
Run Code Online (Sandbox Code Playgroud)

  • 我曾是.非常感谢你! (4认同)
  • 谢谢负载 - 非常非常有帮助 (2认同)

Gre*_*con 8

#include <stdio.h>
#include <stdlib.h>

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

$ ./hex ff
255
Run Code Online (Sandbox Code Playgroud)


Rub*_*ink 7

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

正如其他示例中所述,有更短的方法,但它们都不允许您干净地错误检查处理(如果有人通过FFF而您只需unsiged char要将其放入,会发生什么?

例如sscanf:

int val;
sscanf(argv[1], &val)
printf("%d\n", val); 
Run Code Online (Sandbox Code Playgroud)