我有一个指向字节的指针,它实际上指向 4 个字节的数组(由 RegQueryValueEx 创建)。
我想将这 4 个字节转换为一个 DWORD。
虽然看起来很简单,而且肯定有现成的方法可以做到,但我没有成功找到它。
或者:注册值是一个时间戳。有没有一种方法可以将代表时间戳的 4 字节数组转换为字符串?
我有一个指向字节的指针,它实际上指向 4 个字节的数组(由 RegQueryValueEx 创建)。
我想将这 4 个字节转换为一个 DWORD。
虽然看起来很简单,而且肯定有现成的方法可以做到,但我没有成功找到它。
或者:注册值是一个时间戳。有没有一种方法可以将代表时间戳的 4 字节数组转换为字符串?
您是在询问如何获取四个字节的数组并将其转换为 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 *
并取消引用它来工作的。这被认为是非常糟糕的做法,因为它引入了以下可移植性问题:
int
是 32 位,那么如果目标系统需要,编译器必须保证对齐。char[4]
不保证A对齐到 4 个字节。查看 MAKEWORD MAKELONG 宏。