Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно класть WORD, DWORD, BYTE 
V
    Опции темы
eXa
Дата 24.1.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Код

struct test
{
DWORD d_1;
WORD d_2;
BYTE d_3;
}; test pack


Чем WORD, DWORD, BYTE между собой отличаются? Какая разница при чтении этих переменных
Код

pack.d_1 = 0x01;
pack.d_2 = 0x01;
pack.d_3 = 0x01;

 
Как правильно записать 00 00 00 01 в DWORD,   00 01 в WORD,  F4 A1 в BYTE. Можеть статьи есть какие?)




Это сообщение отредактировал(а) eXa - 24.1.2008, 21:41
PM MAIL   Вверх
archimed7592
Дата 24.1.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



eXa, чего, куда и откуда класть? Что за огрызок кода? В чём заключается сам вопрос?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
eXa
Дата 24.1.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



поправил... нечайно создал тему не дописав вопроса)

Это сообщение отредактировал(а) eXa - 24.1.2008, 21:30
PM MAIL   Вверх
archimed7592
Дата 24.1.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



eXa, 
Код

pack.d_1 = 0x00000001;
pack.d_2 = 0x0001;
pack.b = 0xf4;

Теперь такие моменты:
1. Засунуть в BYTE два байта(f4 a1) невозможно.
2. Именовать переменную 2_3 недопустимо.

Добавлено через 5 минут и 18 секунд
Цитата(eXa @  24.1.2008,  21:23 Найти цитируемый пост)
Чем WORD, DWORD, BYTE между собой отличаются? 

Размером.
DWORD - 4 байта
WORD - 2 байта
BYTE - угадай сам smile.
И, соответственно, диапазоном возможных значений.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
eXa
Дата 24.1.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Код


typedef struct test
{
      BYTE  text_1;
      BYTE  mat_1;
      WORD  text_2;
      WORD  mat_2;
      DWORD text_3;
      DWORD mat_3;
};

struct test packet;

int main()
{
     packet.text_1 = 0x2A;
     packet.mat_1 = 0x2F;
     packet.text_2 = 0x0002;
     packet.mat_2 = 0x3542;
     packet.text_3 = 0x00000001;
     packet.mat_3 = 0x00000002;
     printf("%x", packet);
}


Печать:22f2a

Почему выводит только
 packet.text_1 = 0x2A;
 packet.mat_1 = 0x2F;
 packet.text_2 = 0x0002;

и почему идёт запись с конца?

Это сообщение отредактировал(а) eXa - 24.1.2008, 21:52
PM MAIL   Вверх
archimed7592
Дата 24.1.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Смотри, есть такой тип int. AFAICS - на твоём компиляторе int занимает 4 байта. Форматной инструкцией %x ты говоришь printf'у вывести на экран одну переменную типа int в шестнадцатиричном виде, а передаёшь ты ему целую структуру размером, заведомо большим, чем размер int, но, т.к. printf не знает что именно ты ему передал, он может только "догадываться", основываясь на форматных инструкциях, которые ты ему указал. Т.к. ты попросил вывести число типа int он его и выводит, а то что там дальше ещё байты есть - ему до лампочки(я бы даже сказал, что это очень плохо, что ты передаёшь ему больше данных, чем заявил - может привести к повреждению стека).

Добавлено через 4 минуты и 57 секунд
Цитата(eXa @  24.1.2008,  21:51 Найти цитируемый пост)

и почему идёт запись с конца?

Little endian(на английском лучше).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 24.1.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(archimed7592 @  24.1.2008,  22:05 Найти цитируемый пост)
что это очень плохо, что ты передаёшь ему больше данных, чем заявил - может привести к повреждению стека

не может


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 24.1.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(MAKCim @  24.1.2008,  22:21 Найти цитируемый пост)
не может 

Похоже, что ты прав smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
eXa
Дата 24.1.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Как я понимаю правильная запись для последующей передачи по сети будет выглядить так?
Код

  packet.text_1 = htons(0x2A);
  packet.mat_1 = htons(0x2F);
  packet.text_2 = htons(0x0002);
  packet.mat_2 = htons(0x3542);
  packet.text_3 = htons(0x00000001);
  packet.mat_3 = htons(0x00000002);


Цитата

я бы даже сказал, что это очень плохо, что ты передаёшь ему больше данных, чем заявил - может привести к повреждению стека


И как правильно тогда передавать данные?

Это сообщение отредактировал(а) eXa - 24.1.2008, 22:40
PM MAIL   Вверх
MAKCim
Дата 24.1.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(eXa @  24.1.2008,  22:38 Найти цитируемый пост)
И как правильно тогда передавать данные?

правильно - это когда спецификация тождественна переданным данным


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
eXa
Дата 24.1.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



Цитата

правильно - это когда спецификация тождественна переданным данным

что тут правильней чем %x O_o
Код

c    Character    a
d or i    Signed decimal integer    392
e    Scientific notation (mantise/exponent) using e character    3.9265e+2
E    Scientific notation (mantise/exponent) using E character    3.9265E+2
f    Decimal floating point    392.65
g    Use the shorter of %e or %f    392.65
G    Use the shorter of %E or %f    392.65
o    Signed octal    610
s    String of characters    sample
u    Unsigned decimal integer    7235
x    Unsigned hexadecimal integer    7fa
X    Unsigned hexadecimal integer (capital letters)    7FA
p    Pointer address    B800:0000
n    Nothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored.    
%    A % followed by another % character will write % to stdout.


Мне главное очень важно знать, для передачи по сети, эта правильная запись?
Код

packet.text_1 = htons(0x2A);
packet.mat_1 = htons(0x2F);
packet.text_2 = htons(0x0002);
packet.mat_2 = htons(0x3542);
packet.text_3 = htons(0x00000001);
packet.mat_3 = htons(0x00000002);


Это сообщение отредактировал(а) eXa - 24.1.2008, 23:04
PM MAIL   Вверх
MAKCim
Дата 24.1.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



eXa, 
в printf передавай значения полей структуры (согласно приведенной тобой спецификации), а не саму структуру


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
eXa
Дата 24.1.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 1.12.2006

Репутация: нет
Всего: нет



MAKCim только по полям выводить, разве нельзя всю сразу? на то она и структура...
PM MAIL   Вверх
jonie
Дата 25.1.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



можно все... вопрос зачем?
вы главное не забывайте про 1) выранивание полей в структуре 2)необходимости того что вы делаете 3)в стек будет (у вас) вместо байта (Если вдруг захотите пихать его вообще) пихаться int ("особенность процессора")


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
archimed7592
Дата 25.1.2008, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(jonie @  25.1.2008,  00:19 Найти цитируемый пост)
"особенность процессора"

 smile Особенности языка...

Сообщения были разделены в тему Как передавать char * по сети?

Это сообщение отредактировал(а) archimed7592 - 25.1.2008, 17:02


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.