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

时间:2012-07-31 06:06:38

标签: visual-c++ registry timestamp typeconverter

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

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

2 个答案:

答案 0 :(得分:3)

您正在询问如何获取四个字节的数组并将其转换为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);
}

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

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

陷阱警告:
以下代码完全合法C,即它将编译没有错误:

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

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

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

答案 1 :(得分:1)

查看MAKEWORD MAKELONG宏。