我有一个字符串,例如char *x = "1234 is a test";
,其中前4个字符是十六进制数字,我需要提取为整数。
我的方法是提取前4个字符:
char dest[5];
strncpy(dest, x,4);
char dest[5]='\0';
如何将此4-char字符串转换为int
?
我尝试使用strtol(dest, &ptr,16 );
,但strtol
找到并转换了数值。
看来字符串是从网络获得的;因此,在不使用strtol
的情况下,我想使用十六进制到十进制的转换。我需要首先将4个字符包装成int
类型并使用它。
如何将这4个字符合并到int
?
答案 0 :(得分:1)
char *x = "1234 is a test";
根据您是否可以依赖对第五个字符不是十六进制数字,您可以跳过复制,并将strtol()
直接对准x
。它将停止解析第一个字符,该字符不是您选择的基数中的有效数字。
如果您不能依赖它,您的复制代码需要进行一些清理:char dest[5]
声明一个包含五个元素的数组,索引 0 到 4 ,因此dest[5] = '\0';
会将不存在的第六元素设置为零,从而导致未定义的行为。复制后,这些数字将位于dest[0]
到dest[3]
,因此您希望归零dest[4]
。
将char
放入char dest[4] = '\0';
,否则您将重新声明dest
...
char dest[5];
strncpy( dest, x, 4 );
dest[4] = '\0';
更优雅的是:
char dest[5] = { 0 }; // actually sets *all* elements to zero
memcpy( dest, x, 4 );
我尝试过使用strtol(dest,& ptr,16);
那应该有效,真的。你没有显示代码;根据你的评论strtol()
“找到数值和分离”,我假设你有点困惑,并查看ptr
的结果。这只是strtol()
停止解析的指针。 结果由strtol()
返回。
char * ptr;
int i = strtol( dest, &ptr, 16 );
如果您对结束指针不感兴趣,可以通过NULL
:
int i = strtol( dest, NULL, 16 );
实际上,如果前4个字节的不是十六进制数字,而是int
的二进制表示(您的最后一个段落在其中编辑)稍后似乎暗示),实现它的方式是union
。
union
{
int ival;
char cval[4];
} convert;
memcpy( &convert.cval, x, 4 );
int i = convert.ival;
当然,这是假设sizeof( int ) == 4
和那个接收者具有与发送者相同的字节顺序(字节顺序)..如果不是,那你就麻烦了,unions
这样很棘手
答案 1 :(得分:-1)
假设第一个字节是最重要的字节:
int convert_char(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
}
else if (c >= 'A' && c <= 'F') {
return (10 + c - 'A');
}
else if (c >= 'a' && c <= 'f') {
return (10 + c - 'a');
}
return 0;
}
char *x = "1234 is a test";
int y = 0;
y = convert_char(x[0]) * 16 * 16 * 16 + convert_char(x[1]) * 16 * 16 + convert_char(x[2]) * 16 + convert_char(x[3]);