【发布时间】:2012-07-31 06:06:37
【问题描述】:
我有一个指向字节的指针,它实际上指向 4 个字节的数组(由 RegQueryValueEx 创建)。
我想将这 4 个字节转换为一个 DWORD。
虽然看起来很简单,而且肯定有现成的方法可以做到,但是我没找到。
或者:注册值是时间戳。有没有办法将代表TimeStamp的4字节数组转换成字符串?
【问题讨论】:
标签: visual-c++ registry timestamp typeconverter
我有一个指向字节的指针,它实际上指向 4 个字节的数组(由 RegQueryValueEx 创建)。
我想将这 4 个字节转换为一个 DWORD。
虽然看起来很简单,而且肯定有现成的方法可以做到,但是我没找到。
或者:注册值是时间戳。有没有办法将代表TimeStamp的4字节数组转换成字符串?
【问题讨论】:
标签: visual-c++ registry timestamp typeconverter
您问的是如何获取一个包含四个字节的数组并将其转换为 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] 转到 b[0]。
陷阱警告:
下面的代码是完全合法的 C 代码,即它会编译没有错误:
char c[4];
int x = *((int *)c);
但是,这基本上是通过将 char * 转换为 int * 并取消引用来实现的。这被认为是非常糟糕的做法,因为它引入了以下可移植性问题:
int 是32 位,那么编译器必须保证在目标系统需要时对齐。 char[4] 不保证与 4 个字节对齐。【讨论】:
char c[4]; int i = *((int *)c);,但这种指针欺骗通常被认为是不好的做法,有几个很好的理由。
查看 MAKEWORD MAKELONG 宏。
【讨论】: