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

时间:2010-01-29 15:15:57

标签: c base-conversion strtol

我可以这样做:

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

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

unsigned char cTest = argv[1];

没有做到这一点。这产生了一个初始化从指针生成整数而没有强制转换警告。

6 个答案:

答案 0 :(得分:14)

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

$ ./prog `python -c 'print "\x41\x42\x43"'`
$ ./prog `perl -e 'print "\x41\x42\x43"'`
$ ./prog `ruby -e 'print "\x41\x42\x43"'`

答案 1 :(得分: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);

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

e.g。与sscanf

int val;
sscanf(argv[1], &val)
printf("%d\n", val); 

答案 2 :(得分:7)

#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

答案 3 :(得分:4)

unsigned char cTest = argv[1];

错误,因为argv[1]的类型为char *。如果argv[1]包含"0xff"之类的内容,并且您希望将与其对应的整数值分配给unsigned char,那么最简单的方法可能是使用strtoul()来首先转换它到unsigned long,然后检查转换后的值是否小于或等于UCHAR_MAX。如果是,您只需分配到cTest

strtoul()的第三个参数是一个基数,它可以是0来表示C风格的数字解析(允许八进制和十六进制文字)。如果您只想允许base 16,请将其作为第三个参数传递给strtoul()。如果您想允许任何基础(因此您可以解析0xff0377255等),请使用0。

UCHAR_MAX<limits.h>中定义。

答案 4 :(得分:1)

在C中执行此类操作的传统方法是使用scanf()。这正是printf()的反转,读取文件(或终端)的给定格式 out 和您列出的变量,而不是将它们写入其中。

在您的情况下,您使用sscanf,因为您已经在字符串而不是流中使用它。

答案 5 :(得分:-3)

atoiatolstrtoistrtol

全部在stdlib.h