0xfadec0de
Интересующийся
Offline
|
|
« : 22-06-2009 21:28 » |
|
Всем доброго времени суток. Я совсем недавно начал заниматься С++ и уменя возник вопрос как получить доступ к байтам дворда. Под доступом я имею ввиду не использование масок, а что то вроде этого:
Например у нас есть dword dw = 0x77778899; а мне нужно получить доступ к 0x88 и изменить ,допустим, на 0xCC. Возможно ли это сделать без шаманства с
void *tovoid; unsigned char *tobyte; tovoid = pdword; tobyte = tovoid;
Возможно может существует штука наподобии std::bitset.
plzz ...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 23-06-2009 03:17 » |
|
unsigned long dw; unsigned char b0, b1, b2, b3;
b0 = dw & 255; b1 = (dw >> 8) & 255; b2 = (dw >> 16) & 255; b3 = dw >> 24;
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #2 : 23-06-2009 03:59 » |
|
struct DWORD_STRUCT { union { DWORD dw; char arry[sizeof(DWORD)]; struct { unsigned b0 : 8; unsigned b1 : 8; unsigned b2 : 8; unsigned b3 : 8; }; struct { unsigned bit0 : 1; unsigned bit1 : 1; unsigned bit2 : 1; ... unsigned bit31 : 1; };
}; };
|
|
|
Записан
|
while (8==8)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 23-06-2009 05:04 » |
|
sss, тип DWORD не стандартный — это только MS. Для остальных положен unsigned long. Потом, как у этой структуры с поддержкой разного порядка байт?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #4 : 23-06-2009 05:24 » |
|
RXL, какой вопрос, такой и ответ... А что, твой код сработает да?
|
|
|
Записан
|
while (8==8)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 23-06-2009 06:00 » |
|
sss, работает У меня не структура обрабатывается, а биты в dw.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #6 : 23-06-2009 06:45 » |
|
Не понял, номера байтов правильны в обоих случаях?
|
|
|
Записан
|
while (8==8)
|
|
|
Sla
|
|
« Ответ #7 : 23-06-2009 06:59 » |
|
а структура красивше Offtopic: в паскале для этого есть record с case
Поставлю в угол.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
0xfadec0de
Интересующийся
Offline
|
|
« Ответ #8 : 23-06-2009 07:29 » |
|
Всем спасибо за ответы. RXL, Мы в таком случае, как я понял, получим в и b0...1 значения байтов дворда. А как сделать чтобы изменить это значение в самом дворде, что бы у нас изменилось значение с dw = 0x77778899 на dw = 0x7777СС99;
Как произвести адресацию определенного байта в дворде?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 23-06-2009 07:41 » |
|
0xfadec0de, DWORD dwd;
((BYTE*)&dwd)[0] ((BYTE*)&dwd)[1] ((BYTE*)&dwd)[2] ((BYTE*)&dwd)[3]
(ну, не забывать только Ромины замечания )
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 23-06-2009 07:47 » |
|
А как сделать чтобы изменить это значение в самом дворде, что бы у нас изменилось значение с dw = 0x77778899 на dw = 0x7777СС99; 0xfadec0de, ну ты даёшь! А как изменить 584 на 594? Совсем заучился? Как произвести адресацию определенного байта в дворде? По смещению.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
sss
Специалист
Offline
|
|
« Ответ #11 : 23-06-2009 08:34 » |
|
struct DWORD_STRUCT { union { DWORD dw; char arry[sizeof(DWORD)]; struct { unsigned b0 : 8; unsigned b1 : 8; unsigned b2 : 8; unsigned b3 : 8; }; struct { unsigned bit0 : 1; unsigned bit1 : 1; ... unsigned bit31 : 1; };
}; swap() { DWORD_STRUCT t; t.dw = 1; if ( t.bit0 != 1) { b3 ^= b0; b0 ^= b3; b1 ^= b2; b2 ^= b1; b1 ^= b2; } }; };
DWORD_STRUCT dt.dw = 0x77778899; dw.swap(); //RXL можно работать ??? dt.b1 = 0xCC; dw.swap();
|
|
|
Записан
|
while (8==8)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #12 : 23-06-2009 08:52 » |
|
sss, да черт его поймет... Сомневаюсь. Это же битовая цепочка в памяти - как там она располагается по стандарту... А целое число обрабатывается везде одинаково. Гарантированно работать будет: dw = (dw & 0xffff00ff) | (0xcc << 8);
|
|
« Последнее редактирование: 23-06-2009 08:54 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sss
Специалист
Offline
|
|
« Ответ #13 : 23-06-2009 09:00 » |
|
RXL, не будет! Если младший байт по старшему адресу, почему не ? dw = (dw & 0xffff00ff) | (0xcc000000 >> 8);
А мой код тестирует, преобразует если необходимо к своему формату, изменяет, а затем возвращает формат на место.
|
|
« Последнее редактирование: 23-06-2009 09:02 от sss »
|
Записан
|
while (8==8)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 23-06-2009 09:00 » |
|
может вставить тест, который пнёт, если что ? ) { //где то один раз DWORD dwd=0x11223344; if(sizeof(DWORD)!=4)trhow 0; if(0+(BYTE*)&dwd !=0x44)trhow 0; if(1+(BYTE*)&dwd !=0x33)trhow 0; if(2+(BYTE*)&dwd !=0x22)trhow 0; if(3+(BYTE*)&dwd !=0x11)trhow 0; }
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #15 : 23-06-2009 09:01 » |
|
Насколько я знаю, меняться может позиция байт. От старшего к младшему или от младшего к старшему. Например:
FA C0 78 EF <-> EF 78 C0 FA
А вот про биты... Не слышал.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
sss
Специалист
Offline
|
|
« Ответ #16 : 23-06-2009 09:03 » |
|
Джон, биты не меняются.
Алексей1153++ - посмотри внимательней на мой код...
|
|
|
Записан
|
while (8==8)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #17 : 23-06-2009 09:04 » |
|
Мне тоже так кажется. Иначе операции смещения << >> не имели бы смысла.
ps Вернее смысл они бы имели, но вот результат был бы неоднозначным.
зы зы На практике пользуюсь способом предложенным RXL
|
|
« Последнее редактирование: 23-06-2009 09:06 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #18 : 23-06-2009 09:12 » |
|
А вобще-то парни... "Ну вы блин даёте" (с) так не проще будет?: dw = 0x77778899; dw += (0x7777СС99-dw); А ещё проще: dw = 0x77778899; dw = 0x7777СС99; )
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 23-06-2009 09:37 » |
|
sss, я про тест встроенного типа
|
|
|
Записан
|
|
|
|
0xfadec0de
Интересующийся
Offline
|
|
« Ответ #20 : 23-06-2009 10:24 » |
|
Всем спасиба, в общем я сделал так (для примера с 0x77778899 - > 0x7777СС99)
unsigned long fff (unsigned long dw) { asm MOV AH , 0xCC }
эммм как я понял лучьше для адресации использовать асм :]
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 23-06-2009 10:27 » |
|
0xfadec0de, ты всё неправильно понял, да и код твой сделает не то, что ты хотел )
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #22 : 23-06-2009 10:35 » |
|
RXL, не будет! Если младший байт по старшему адресу, почему не ? dw = (dw & 0xffff00ff) | (0xcc000000 >> 8);
А мой код тестирует, преобразует если необходимо к своему формату, изменяет, а затем возвращает формат на место. Не знаю на счет твоего кода - не проверял. Мой 100% работает на любом порядке байт: порядок меняется в памяти, а в регистрах он вообще не имеет смысла.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
0xfadec0de
Интересующийся
Offline
|
|
« Ответ #23 : 23-06-2009 10:47 » |
|
0xfadec0de, ты всё неправильно понял, да и код твой сделает не то, что ты хотел )
Разве код не работает конкретно к примеру (0x77778899 - > 0x7777СС99) Что я делаю не првельно
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 23-06-2009 11:04 » |
|
0xfadec0de, ну, скажем так, использование ассемблера тут роли не играет (хотя, ты привязал программу к типу процессора, пусть даже и очень распространённому)
кроме того, код засунет 0xcc в регистр, а тебе нужна переменная
|
|
|
Записан
|
|
|
|
0xfadec0de
Интересующийся
Offline
|
|
« Ответ #25 : 23-06-2009 11:31 » |
|
В регистре EAX после отработки fff будет 0x7777СС99. Переменную получим так например
unsigned long z = 0x7777СС99; unsigned long z = fff(z);
Хотя это всеаки очень бредовый способ. Самы оптимальный это x = (x & 0xffff00ff) | (0xcc << 8 ) Как подсказал RXL.
|
|
|
Записан
|
|
|
|
yanart
Гость
|
|
« Ответ #26 : 28-08-2009 07:21 » |
|
Всем доброго времени суток. Я совсем недавно начал заниматься С++ и уменя возник вопрос как получить доступ к байтам дворда. Под доступом я имею ввиду не использование масок, а что то вроде этого:
Например у нас есть dword dw = 0x77778899; а мне нужно получить доступ к 0x88 и изменить ,допустим, на 0xCC. Возможно ли это сделать без шаманства с
void *tovoid; unsigned char *tobyte; tovoid = pdword; tobyte = tovoid;
Возможно может существует штука наподобии std::bitset.
plzz ...
Все очень просто union { unsigned long dw; unsigned char b[4]; }u; void main() { u.dw = 0x77778899; u.b[1]=0xCC; }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 28-08-2009 08:09 » |
|
yanart, зачем такой опасный способ, в посте sss #2 всё гораздо лучше сделано )
Мы тут смотрим, ты спамить и свой сайт рекламить пришёл. За это можно и наказать, учти
|
|
« Последнее редактирование: 28-08-2009 08:10 от Алексей1153++ »
|
Записан
|
|
|
|
yanart
Гость
|
|
« Ответ #28 : 28-08-2009 09:02 » |
|
yanart, зачем такой опасный способ, в посте sss #2 всё гораздо лучше сделано )
Мы тут смотрим, ты спамить и свой сайт рекламить пришёл. За это можно и наказать, учти
1. Я просто показал человеку ответ на его вопрос. 2. Спам - это когда ответ не несет смысловой нагрузки. 3. А разве подписи запрещены? 4. А разве плохо, когда новички увидят бесплатные видеоматериалы на моем сайте?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #29 : 28-08-2009 09:15 » |
|
2. да 3. запрещена реклама в них 4. да
|
|
|
Записан
|
|
|
|
|