代码之家  ›  专栏  ›  技术社区  ›  Gora

如何将字符数组中的字节转换为int

  •  0
  • Gora  · 技术社区  · 7 年前

    我想用C中的字符数组生成一个int变量。

    char数组如下所示:

    buffer[0] = 0xcf
    buffer[1] = 0x04
    buffer[2] = 0x00
    buffer[3] = 0x00
    

    换档是这样的

    x = (buffer[1] << 8 )| (buffer[0] << 0) ;
    

    之后,x看起来像这样:

    x = 0xffff04cf
    

    现在,如果前两个字节不是ff,一切都会好起来。

    如果我试试这句话

    x = (buffer[3] << 24 )| (buffer[2] << 16)| (buffer[1] << 8)| (buffer[0] << 0) ;
    

    看起来还是这样

    x=0xffff04cf
    

    即使我尝试在04cf中移位之前或之后移位0,它看起来仍然是一样的。

    这是正确的想法还是我做错了什么?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Stephan Lechner    7 年前

    问题是你宣布 buffer 通过有符号类型,可能是(有符号)字符。应用运算符时 << ,将执行整体促销,并作为价值 0xcf 在8位有符号类型中,表示负值(即。 -49 ),它将保持负值(但由更多位表示,即。 0xffffffcf ). 请注意 -1 表示为 0xFFFFFFFF 反之亦然。

    要解决这个问题,只需定义 缓冲器

    unsigned char buffer[4]
    

    如果不允许您更改 缓冲器 ,你可以写。。。

    unsigned x = ( (unsigned char)buffer[0] << 8 )| ((unsigned char)buffer[1] << 4) ;
    
        2
  •  0
  •   PJRobot    7 年前

    对于这样的任务,我喜欢使用联合,例如:

    union tag_int_chars {
        char buffer[sizeof(int32_t)];
        int32_t value;
    } int_chars;
    
    int_chars.value = 0x01234567;
    
    int_chars.buffer[0] = 0xff;
    

    这将自动化内存覆盖,而无需移动。设置int的值,瞧,字符已更改,更改字符值,瞧,int已更改。

    该示例将在小端机器上保留int值=0x012345ff。

    另一种简单的方法是使用memcpy():

    #include <string.h>
    
    char buffer[sizeof(int32_t)];
    int32_t value;
    
    memcpy(&value, buffer, sizeof(int32_t));   // chars to int
    memcpy(buffer, &value, sizeof(int32_t));   // int to chars