【问题标题】:Convert 4 bytes into DWORD in C++在 C++ 中将 4 个字节转换为 DWORD
【发布时间】:2012-07-31 06:06:37
【问题描述】:

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

或者:注册值是时间戳。有没有办法将代表TimeStamp的4字节数组转换成字符串?

【问题讨论】:

    标签: visual-c++ registry timestamp typeconverter


    【解决方案1】:

    您问的是如何获取一个包含四个字节的数组并将其转换为 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 * 并取消引用来实现的。这被认为是非常糟糕的做法,因为它引入了以下可移植性问题:

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

    【讨论】:

    • 我知道,也这样做了。但我想知道为什么这么简单的方法不存在
    • 有没有办法将 DWORD 指向 BYTE 的相同引用并获得结果? (有或没有内存复制)
    • 可以在技术上说char c[4]; int i = *((int *)c);,但这种指针欺骗通常被认为是不好的做法,有几个很好的理由。
    • 编辑了答案以详细说明上述评论。
    • DWORD64 怎么样?同样的方法可以吗?
    【解决方案2】:

    查看 MAKEWORD MAKELONG 宏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2012-12-15
      相关资源
      最近更新 更多