C++中将4个字节转换为DWORD

Aha*_*ron 2 registry timestamp typeconverter visual-c++

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

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

Ben*_*enW 5

您问的是如何获取一个包含四个字节的数组并将其转换为 32 位值,对吗?它实际上非常简单(假设您认为按位运算符很简单):

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);
}
Run Code Online (Sandbox Code Playgroud)

这假设您的整数是以小端存储的。这意味着首先存储最低有效字节,因此如果您有一个字 0x1234,它将以两个字节 0x34、0x12 的顺序存储在内存中。

在 big-endian 中,数字 0x1234 将作为 0x12、0x34 存储在内存中。如果这就是你想要的,那么只需反转数组索引,即从b[3]b[0]

陷阱警告:
以下代码是完全合法的 C 语言,即编译时不会出错:

char c[4];
int x = *((int *)c);
Run Code Online (Sandbox Code Playgroud)

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

  • 字节序,如上解释。不同的处理器架构以不同的方式存储字。例如,x86 处理器是小端的,而 PowerPC 是大端的。上述构造对处理器如何解释 4 字节值进行了假设。
  • 内存对齐问题。一些架构要求字访问对齐。也就是说,多字节内存访问的地址必须是字长的倍数。上面的代码将在 x86 上工作,它允许未对齐的访问,但其他架构如 68000 会阻塞并给出总线错误。
    C 语言中的变量保证与该大小正确对齐;这意味着如果 anint是 32 位,那么如果目标系统需要,编译器必须保证对齐。Achar[4]不能保证对齐到 4 个字节。