将4bytes转换为有符号和无符号int

时间:2018-11-24 19:38:12

标签: c++ int

我想在c ++中将四字节字符串转换为int32uint32This answer帮助我编写了以下代码:

#include <string>
#include <iostream>
#include <stdint.h>

int main()
{
    std::string a("\xaa\x00\x00\xaa", 4);

    int u = *(int *) a.c_str();
    int v = *(unsigned int *) a.c_str();
    int x = *(int32_t *) a.c_str();
    int y = *(uint32_t *) a.c_str();
    std::cout << a << std::endl;
    std::cout << "int: " << u << std::endl;
    std::cout << "uint: " << v << std::endl;
    std::cout << "int32_t: " << x << std::endl;
    std::cout << "uint32_t: " << y << std::endl;

    return 0;
}

但是输出都是一样的,其中int(或int32_t)的值是正确的,但无符号的值是错误的。为什么未签名的转换不起作用?

// output
int:      -1442840406
uint:     -1442840406
int32_t:  -1442840406
uint32_t: -1442840406

Python struct.unpack,可提供正确的转换

In [1]: import struct
In [2]: struct.unpack("<i", b"\xaa\x00\x00\xaa")
Out[2]: (-1442840406,)
In [3]: struct.unpack("<I", b"\xaa\x00\x00\xaa")
Out[3]: (2852126890,)

我也想为int16uint16使用类似的解决方案,但首先要考虑的是,因为我想如果设法解决此问题,扩展将是微不足道的。

1 个答案:

答案 0 :(得分:0)

您需要将无符号值存储在无符号变量中,这将起作用:

const myDate: Date = (queryString as {date: Date}).date

将值强制转换为无符号,然后将其存储在有符号变量中时,编译器将继续运行。稍后,当您打印带符号变量时,编译器会生成代码以打印带符号变量输出。