从char字符串中提取char的4个字节,并将前4个字节转换为c

时间:2015-09-09 09:10:38

标签: c

我有一个字符串,例如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

2 个答案:

答案 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]);