使用 C 将四个字节转换为整数

新手上路,请多包涵

我正在尝试使用 C++ 将 4 个字节转换为整数。

这是我的代码:

 int buffToInteger(char * buffer)
{
    int a = (int)(buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]);
    return a;
}

上面的代码几乎适用于所有情况,例如:当我的缓冲区是: "[\x00, \x00, \x40, \x00]" 代码将按预期返回 16384

但是当缓冲区填充: "[\x00, \x00, \x3e, \xe3]" 时,代码将无法按预期工作,并将返回 "ffffffe1"

有谁知道为什么会这样?

原文由 Y. Franco 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

您的 buffer 包含 签名 字符。 So, actually, buffer[0] == -29 , which upon conversion to int gets sign-extended to 0xffffffe3 , and in turn (0x3e << 8) | 0xffffffe3 == 0xffffffe3 .

You need ensure your individual buffer bytes are interpreted unsigned , either by buffer as unsigned char * , or by explicitly casting:

 int a = int((unsigned char)(buffer[0]) << 24 |
            (unsigned char)(buffer[1]) << 16 |
            (unsigned char)(buffer[2]) << 8 |
            (unsigned char)(buffer[3]));

原文由 mindriot 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为这也可以通过使用 memcpy 来完成:

 int buffToInteger(char* buffer)
{
    int a;
    memcpy( &a, buffer, sizeof( int ) );
    return a;
}

这比原始帖子中提到的示例要快得多,因为它只是“按原样”处理所有字节,并且不需要执行任何操作,例如位移等。它也不会导致任何有符号无符号问题。

原文由 Tomasz Kowalczyk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏