我正在编写一些C代码,其中包含以下内容:
typedef uint8_t BYTE;
typedef int8_t SBYTE;
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef uint64_t QWORD;
我有一个定义为QWORD exp_d(const DWORD *in)
的函数。
我有一个指向QWORD的指针QWORD* input
。作为QWORD,它是64位。现在,我想将input
的最不重要的32位发送到函数exp_d
。我正在做的是,
QWORD expansion=exp_d(((DWORD*)input)+1);
我认为,input
是QWORD*
,所以首先将其类型转换为DWORD*
,然后将其加1(到达下一个DWORD
,即最少重要的32位QWORD
)应该做的事情。但是,当我将此值传递给exp_d
时,我得到input
的最重要的32位而不是预期的最低32位。
我哪里错了?
答案 0 :(得分:1)
如果输入的类型为QWORD
:
(uint32_t) ((*input) & 0xffffffff)
答案 1 :(得分:0)
如果无法修改函数exp_d
,则可能需要定义另一个函数,该函数将指针从64位指针返回到低32位。内部功能,根据您的系统字节顺序返回地址。
DWORD * GetDwordFromQword(const QWORD *input)
{
if(BigEndian()) {
return (DWORD*)input+1;
} else {
return (DWORD*)input;
}
}
BigEndian()
定义可以在这里引用Detecting endianness programmatically in a C++ program