在存储在char数组中的字节上使用strtol

时间:2014-05-22 00:01:10

标签: c string char byte strtol

我正在尝试从char数组中提取第2个和第3个字节,并将其值解释为整数。在这种情况下,想要使用strtol提取0x01和0x18并将其值解释为0x118或280(十进制)。但输出行为len返回0。

int main() {

char str[]={0x82,0x01,0x18,0x7d};
char *len_f_str = malloc(10);
int i;
memset(len_f_str,'\0',sizeof(len_f_str));

strncpy(len_f_str,str+1,2);

printf("%x\n",str[1] & 0xff);
printf("%x\n",len_f_str[1] & 0xff);
printf("act len:%ld\n",strtol(len_f_str,NULL,16));

return 0;
}

输出:

bash-3.2$ ./a.out 
1
18
act len:0

我在这里缺少什么?帮助赞赏。

2 个答案:

答案 0 :(得分:1)

strtol将字符串的ASCII表示转换为值,而不是实际位。

试试这个:

short* myShort;
myShort = (short*) str[1];
long myLong = (long) myShort;

答案 1 :(得分:0)

strtol期望输入是一个字符序列,表示可打印形式的数字。要表示0x118,您需要使用

char *num = "118";

如果您然后将num传递给strtol,并给它一个基数16,那么您将获得280回。

如果您的数字表示为字节序列,您可以使用简单的数学计算结果:

unsigned char str[]={0x82,0x01,0x18,0x7d};
unsigned int res = str[1] << 8 | str[2];