我正在尝试从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
我在这里缺少什么?帮助赞赏。
答案 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];