2014-02-07 3 views
0

Я пишу немного кода 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 бита. Теперь я хочу отправить наименее значимые 32 бита input для функции exp_d. Что я делаю,

QWORD expansion=exp_d(((DWORD*)input)+1);

Я думаю, input является QWORD*, поэтому первый типажи его к DWORD*, а затем incrimenting его на 1 (чтобы добраться до следующего DWORD, то есть наименее значащие 32 бита QWORD). Однако, когда я передаю такое значение exp_d, я получаю наиболее значимые 32 бита input, а не наименее значимые 32 бита, как ожидалось.

Куда я иду не так?

+8

http://en.wikipedia.org/wiki/Endianness –

ответ

0

Если функция exp_d не может быть изменен, то вам, возможно, потребуется определить другую функцию, вернуть указатель на 32 бита от 64-битного указателя. Внутренняя функция, адрес возврата в соответствии с вашей системой.

DWORD * GetDwordFromQword(const QWORD *input) 
{ 
    if(BigEndian()) { 
     return (DWORD*)input+1; 
    } else { 
     return (DWORD*)input; 
    } 
} 

BigEndian() определение может относиться здесь Detecting endianness programmatically in a C++ program

1

Используйте числовое значение, если тип входа является QWORD:

(uint32_t) ((*input) & 0xffffffff) 
+0

функция 'exp_d' ожидается указатель, а не значение – yongzhy

Смежные вопросы