Visual c++ 将4个字节转换为C+中的DWORD+;

Visual c++ 将4个字节转换为C+中的DWORD+;,visual-c++,registry,timestamp,typeconverter,Visual C++,Registry,Timestamp,Typeconverter,我有一个指向字节的指针,它实际上指向由4个字节组成的数组(由RegQueryValueEx创建)。 我想将这4个字节转换成一个DWORD。 虽然它看起来很简单,而且肯定有一个现有的方法可以做到这一点,但我没有成功地找到它 或者:注册值是时间戳。是否有一种方法可以将表示时间戳的4字节数组转换为字符串?您正在询问如何将4字节数组转换为32位值,对吗?其实很简单(假设你认为位运算符是简单的): 但是,这基本上是通过将char*强制转换为int*并取消对它的引用来实现的。这被认为是非常糟糕的做法,因为它

我有一个指向字节的指针,它实际上指向由4个字节组成的数组(由RegQueryValueEx创建)。
我想将这4个字节转换成一个DWORD。
虽然它看起来很简单,而且肯定有一个现有的方法可以做到这一点,但我没有成功地找到它


或者:注册值是时间戳。是否有一种方法可以将表示时间戳的4字节数组转换为字符串?

您正在询问如何将4字节数组转换为32位值,对吗?其实很简单(假设你认为位运算符是简单的):

但是,这基本上是通过将
char*
强制转换为
int*
并取消对它的引用来实现的。这被认为是非常糟糕的做法,因为它引入了以下可移植性问题:

  • Endianness,如上所述。不同的处理器架构以不同的方式存储字。例如,x86处理器是little endian,而PowerPC是big endian。上述构造假设处理器如何解释4字节值
  • 内存对齐问题。某些体系结构要求对齐字访问。也就是说,多字节内存访问的地址必须是字大小的倍数。上面的代码将在x86上运行,它允许未对齐的访问,但是像68000这样的其他架构将阻塞并产生总线错误。
    C中的变量保证与该大小正确对齐;这意味着,如果
    int
    是32位,那么如果目标系统需要,编译器必须保证对齐。
    char[4]
    不能保证与4字节对齐

研究MAKEWORD MAKELONG宏。

我知道,也知道。但我想知道为什么不存在这么简单的方法——没有办法将DWORD指向相同的字节引用并得到结果?(有或没有复制内存)从技术上讲,你可以说
charc[4];int i=*((int*)c),但这种指针欺骗通常被认为是不好的做法,有几个好的理由。编辑答案以详细说明上述注释。DWORD64如何?同样的方法可以吗?
typedef unsigned int dword;
typedef unsigned char byte;

//Convert an array of four bytes into a 32-bit integer.
dword getDwordFromBytes(byte *b)
{
    return (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
}
char c[4];
int x = *((int *)c);