通过命令行传递十六进制字符串参数
程序运行 ./test_main 0x12345678
方法1:每一字节存在一个char里 方法2:直接转成10进制数
int main(int argc, char** argv)
{
unsigned char tmp;
unsigned char match[64];
char *str;
int i;
memset(match, 0, 64);
str = argv[1];
if (str[0] == '0' && str[1] == 'x')
{
str += 2;
}
for (i = 0; i< strlen(str); i ++)
{
if ('0' <= str[i] && str[i] <= '9')
{
tmp = str[i] - '0';
}
else if ('a' <= str[i] && str[i] <= 'f')
{
tmp = str[i] - 'a' + 10;
}
else if ('A' <= str[i] && str[i] <= 'F')
{
tmp = str[i] - 'A' + 10;
}
else
{
printf("input error! %s\n", str);
}
if (0 == i % 2)
{ // 第一次循环走这里tmp二进制表示为 0000 0001
match[i/2] = tmp << 4; // match[0] 为0001 0000
}
else
{
//第二次循环走这里tmp二进制表示为 0000 0010
match[i/2] |= tmp; // match[0]为 0001 0010 即 0x12
}
}
for (i = 0; i < 64; i++)
{
printf("0x%02x\n",match[i]);
}
return 0;
}
//程序打印结果为 0x12 0x34 0x56 0x78 ....
方法2
#include <stdio.h>
#include <string.h>
#include <math.h>
int char_to_hex(char *byte)
{
int tmp = 0;
if('0' <= *byte && *byte <= '9')
tmp = *byte - '0';
else if('a' <= *byte && *byte <= 'f')
tmp = *byte - 'a' + 10;
else if('A' <= *byte && *byte <= 'F')
tmp = *byte - 'A' + 10;
else
return -1;
return tmp;
}
int main(int argc, char** argv)
{
unsigned int total=0;
unsigned char tmp;
char *str;
int i;
str = argv[1];
if (str[0] == '0' && str[1] == 'x')
{
str += 2;
}
for (i = 0; i< strlen(str); i ++)
{
tmp = char_to_hex(str);
total+= tmp * pow(16,strlen(str)-i-1);
str++;
}
printf("total = %08x\n",total);
return 0;
}
方法3:
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
unsigned int total=0;
unsigned char tmp;
char *str;
str = argv[1];
/*直接将16进制字符串转成整形*/
total = strtol(str, NULL, 16);
return 0;
}