Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как обратиться к байтам переменной типа int?

388
15 октября 2004 года
warezhka
129 / / 11.10.2004
Народ!
1) Допустим у нас есть переменная типа int (или unsigned int), и она равна какому-то числу. Как можно переменной типа unsigned char приcвоить значение 2-ого, 3-его или 4-ого байта. Кроме битовый сдвига, можно как нито напрямую обратиться к конкретному байту переменной int?
2) Как можно решить обратную задачу: в определенный байт переменной типа int записать число unsigned char не используя сдвигов?
831
15 октября 2004 года
S_T
117 / / 23.10.2002
Попробуй так

int iA;
BYTE* pbtA = (BYTE*)(&iA);
pbtA[0] - самый младший байт
pbtA[3] - самый старший байт

Можешь написать
BYTE btA0 = pbtA[0]; так ты считаешь байт
Можешь написать
pbtA[0] = 3; так ты решишь свою обратную задачу

Если нет #include <windows.h>, то неплохо бы заменить BYTE на unsigned char или написать
typedef unsigned char BYTE;
8.7K
15 октября 2004 года
e3136c
9 / / 15.10.2004
union
{
int a;
BYTE b[4];
}

и обращатся надо к соответствущему байту в b[] массиве.

Удачи.. :)
292
15 октября 2004 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by warezhka
Народ!
1) Допустим у нас есть переменная типа int (или unsigned int), и она равна какому-то числу. Как можно переменной типа unsigned char приcвоить значение 2-ого, 3-его или 4-ого байта. Кроме битовый сдвига, можно как нито напрямую обратиться к конкретному байту переменной int?
2) Как можно решить обратную задачу: в определенный байт переменной типа int записать число unsigned char не используя сдвигов?



А можно так:
int a=918234670;// переменная для примера
char t = *((char*)&a+2); // в t записывается 2 бай переменной а, 0,1,2,3 - соответственно для других байтов
А вот обратная операция (запись в конкретный байт):
char b=7;
int a = 0;
*((char*)&a+2)= b;//*(int*)&Pss[0]//Записывает во 2 байт
Красиво и качественно, работает быстро, поскольку данное выражение поясняет компилятору что надо делать и в уже скомпилиной проге вычесления не происходят

527
15 октября 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Matush


А можно так:
int a=918234670;// переменная для примера
char t = *((char*)&a+2); // в t записывается 2 бай переменной а, 0,1,2,3 - соответственно для других байтов
А вот обратная операция (запись в конкретный байт):
char b=7;
int a = 0;
*((char*)&a+2)= b;//*(int*)&Pss[0]//Записывает во 2 байт
Красиво и качественно, работает быстро, поскольку данное выражение поясняет компилятору что надо делать и в уже скомпилиной проге вычесления не происходят


Да-а-а-а-а-а-а-а-а-а!
Если это красиво, то я - Кнут!
Используй объединения, а если кто-то думает, что
mov [ebx], al
работает быстрее, чем
mov [ebx + 2], al
То пусть использует страшные выражения с указателями.

3
15 октября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by pavor

Да-а-а-а-а-а-а-а-а-а!
Если это красиво, то я - Кнут!
Используй объединения, а если кто-то думает, что
mov [ebx], al
работает быстрее, чем
mov [ebx + 2], al
То пусть использует страшные выражения с указателями.



Все эти +2 не попадут в конечный код, все смещения в данном случае посчитает компилятор.
Но метод, действительно, не кроасивый, не наглядный.
Я бы предпочел метод, который привел S_T.
Объединения я не стал бы использовать, т.к. вводится новый тип данных и придется обращаться к полям этого типа.

292
15 октября 2004 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by Green


Все эти +2 не попадут в конечный код, все смещения в данном случае посчитает компилятор.
Но метод, действительно, не кроасивый, не наглядный.
Я бы предпочел метод, который привел S_T.
Объединения я не стал бы использовать, т.к. вводится новый тип данных и придется обращаться к полям этого типа.


То, что метод ненаглядный (не в том смысле что красивый:) это правда. Но поскольку он небыл описан, то я его и написал.
Но он все-таки красивый в визуальном плане :) да и исходник попавший в нехорошие руки будет более нечитабельным :D

388
15 октября 2004 года
warezhka
129 / / 11.10.2004
Всё ясно:)... вопрос считаю исчерпанным...всем огромное спасибо за ответы....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог