![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alex_G |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 26.7.2004 Репутация: нет Всего: нет |
Растолкуйте если можно простую вещь
есть функция 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 |
|
|||
|
Unregistered |
а в параметре что передаёшь?
|
|||
|
||||
| Alex_G |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 26.7.2004 Репутация: нет Всего: нет |
Извеняюсь за некорректно поставленный вопрос, попробую иначе.
Передаю переменную 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 |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Если в заголовочном файле, как ты говоришь, определено
#define LOWBYTEFIRST и этот заголовочный файл вкючается в cpp-файл, содержащий определение функции SwitchIndian, то фактически эта функция становится такой: DWORD SwitchIndian(DWORD n1) { return n1; } То есть она просто возвращает значение своего параметра. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Олег М |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Всё правильно. Здесь ты
меняешь байты местами, те 0xd499397f получаешь 0x7f3999d4 и результат сохраняешь в dwCRC[0]. Потом ты вызываешь
, где dwCRC[0]==0x7f3999d4 и в результате, после перестановки байтов в s2 сохраняется 0xd499397f. В чём проблема-то? |
||||
|
|||||
| Guest |
|
|||
|
Unregistered |
Не могу понять, почему в s2 идет перестановка байтов. Может функция IntToStr() их переставляет, поясните пожалуйста. |
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Извини, не заметил мне вместо IntToStr померещилась SwitchIndian. А перестановлены они потому, что в памяти байты в слове и слова в двойном слове хранятся в обратном порядке. Это сделано для того, чтобы проще производить преобразования например из WORD в BYTE и т.д. Посмотри само значение dwCRC[0] в шестнацетиричном виде, в отладчике - всё будет правильно. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Дело в том, что если перед SwitchIndian при помощи функции IntToStr передать значения например в мемо (для наглядности) и после вызова SwitchIndian проделать ту же операцию, то результат в мемо будет одинаковый
Извиняюсь за сложность трактовки, но помоему здесь что то не так. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |