2

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

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

4

2 回答 2

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);
}

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

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

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

char c[4];
int x = *((int *)c);

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

  • 字节顺序,上面解释过。不同的处理器架构以不同的方式存储字。例如,x86 处理器是 little-endian,而 PowerPC 是 big-endian。上述结构对处理器如何解释 4 字节值做出了假设。
  • 内存对齐问题。一些体系结构需要对齐字访问。也就是说,多字节内存访问的地址必须是字长的倍数。上面的代码可以在 x86 上工作,它允许未对齐的访问,但是像 68000 这样的其他架构会阻塞并给出总线错误。
    保证 C 中的变量针对该大小正确对齐;这意味着如果 anint是 32 位,那么如果目标系统需要,编译器必须保证对齐。char[4]不保证A对齐到 4 个字节。
于 2012-07-31T06:43:55.773 回答
1

查看 MAKEWORD MAKELONG 宏。

于 2012-08-01T12:40:00.207 回答