我想在c ++中将四字节字符串转换为int32
或uint32
。
This 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,)
我也想为int16
和uint16
使用类似的解决方案,但首先要考虑的是,因为我想如果设法解决此问题,扩展将是微不足道的。
答案 0 :(得分:0)
您需要将无符号值存储在无符号变量中,这将起作用:
const myDate: Date = (queryString as {date: Date}).date
将值强制转换为无符号,然后将其存储在有符号变量中时,编译器将继续运行。稍后,当您打印带符号变量时,编译器会生成代码以打印带符号变量输出。