| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Дерективы процессора |
| Автор: Alex_G 1.8.2004, 13:59 |
| Растолкуйте если можно простую вещь есть функция DWORD SwitchIndian(DWORD n1) { #ifndef LOWBYTEFIRST DWORD n2; char* ps=(char*)&n1; char* pd=(char*)&n2; pd[3] = ps[0]; pd[2] = ps[1]; pd[1] = ps[2]; pd[0] = ps[3]; return n2; #else return n1; #endif } в заголовочном файле определено #define LOWBYTEFIRST почему при вызове результат всегда разный |
| Автор: setq 1.8.2004, 14:30 |
| а в параметре что передаёшь? |
| Автор: Alex_G 1.8.2004, 14:58 |
| Извеняюсь за некорректно поставленный вопрос, попробую иначе. Передаю переменную DWORD. Например так dwCRC[0] = SwitchIndian(dwCRC[0]); // где dwCRC[0] == 3566811519 (или 0xd499397f) потом читаю побитово for (int i1 = 0; i1 < 16; i1++) { s1 += " " + IntToStr(((unsigned char *)dwCRC)[i1]); } и получаю строку - 127 57 153 212, что соответствует 7f 39 99 d4 (тоесть все вроде бы верно функция SwitchIndian переставила местами байты), а потом делаю так: s2:=IntToStr(dwCRC[0]); // s2 должна получить строку 2134481364 (что соответствует 0x7f3999d4), но вместо этого s2 == 3566811519 (или 0xd499397f). Не могу понять какое всетаки значение хранит dwCRC[0] после вызова SwitchIndian(dwCRC[0]) 0xd499397f или 0x7f3999d4 И как в принципе работает деректива #ifndef LOWBYTEFIRST, а также зачем она там нужна. К сожалению код не мой, но очень нуно разобраться. Заранее спасибо! |
| Автор: srd 3.8.2004, 07:26 |
| Если в заголовочном файле, как ты говоришь, определено #define LOWBYTEFIRST и этот заголовочный файл вкючается в cpp-файл, содержащий определение функции SwitchIndian, то фактически эта функция становится такой: DWORD SwitchIndian(DWORD n1) { return n1; } То есть она просто возвращает значение своего параметра. |
| Автор: Олег М 3.8.2004, 08:46 | ||||
Всё правильно. Здесь ты
меняешь байты местами, те 0xd499397f получаешь 0x7f3999d4 и результат сохраняешь в dwCRC[0]. Потом ты вызываешь
, где dwCRC[0]==0x7f3999d4 и в результате, после перестановки байтов в s2 сохраняется 0xd499397f. В чём проблема-то? |
| Автор: Guest 3.8.2004, 20:18 | ||
Не могу понять, почему в s2 идет перестановка байтов. Может функция IntToStr() их переставляет, поясните пожалуйста. |
| Автор: Олег М 4.8.2004, 05:28 | ||
Извини, не заметил мне вместо IntToStr померещилась SwitchIndian. А перестановлены они потому, что в памяти байты в слове и слова в двойном слове хранятся в обратном порядке. Это сделано для того, чтобы проще производить преобразования например из WORD в BYTE и т.д. Посмотри само значение dwCRC[0] в шестнацетиричном виде, в отладчике - всё будет правильно. |
| Автор: Guest 4.8.2004, 09:04 |
| Дело в том, что если перед SwitchIndian при помощи функции IntToStr передать значения например в мемо (для наглядности) и после вызова SwitchIndian проделать ту же операцию, то результат в мемо будет одинаковый Извиняюсь за сложность трактовки, но помоему здесь что то не так. |