Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 212
#1

Куда деваются байты при приведении типов? - C++

07.12.2015, 14:17. Просмотров 227. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток... Т.к. основной проект на c++, то пишу сюда... Непонятки с приведением типов, объясните пожалуйста...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const u_char* packet;
 
struct test{
u_int64_t p64;
//u_int48 ?????????
u_int32_t p32;
u_int16_t p16;
u_int8_t p8;
};
 
//привожу так, Си-шный вариант
struct test* tst;
 
tst = (test*)packet;
Собственно вопросы:
1. Самый главный. когда преобразуется к 8-ми байтному u_int64_t, в p64 сидит только 4 байта, куда делось еще 4 ? p32, p16, p8 все верно 4,2,1 байт.
2. Преобразует он наоборот, чтобы привести к нормальному виду приходится переставлять байты при помощи be16toh, be32toh и be64toh. Можно ли заставить преобразовывать сразу в верном порядке ?
3. Нужен 6 байтный int для тех же целей... Можно ли его как-то слепить для верной работы ? unsigned char a[5]; не предлагать ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2015, 14:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Куда деваются байты при приведении типов? (C++):

Куда деваются данные из массива во время выполнения программы?
Во время выполнения проги куда-то деваются данные из массива из стуктур. Почему...

Куда деваются одномоментные указатели, или управление памятью в работе с std::string
Здравствуйте! Положим, у нас есть функция, возвращающая строку std::string,...

Ну жна помощь в приведении типов
Никак не могу понять как работает приведение типов. В первую очередь про...

Есть 4 потока. После осуществления блокировки барьером, 3 куда-то деваются, куда? (pthreads)
Друзья! Как мог упростил код, вот суть В цикле создаются 4 вспомогательных...

Неопределенное поведение при приведении типа
Суть проблемы в том что, после принудительного приведения типа деструктор...

Контроль корректности при приведении типа указателя
Требуется максимально корректно проверить, что переменная типа viod* содержит...

4
nmcf
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
07.12.2015, 14:25 #2
Приведением порядок байтов не изменить. 6-байтного int нет.
Про первое не понятно. Что за packet?
0
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 212
07.12.2015, 14:50  [ТС] #3
nmcf, packet - указатель на буфер pcap'а, в нем UDP пакет с сетевой карты. Собственно ловлю его Wireshark'ом и своей программой. Сравниваю. В p64 сидит только первые 4 байта, в p32 сидит 5,6,7,8 байты за место 9,10,11,12 и т.д....

Добавлено через 8 минут
Попробовал сделать 6 байтный int так, при приведении в нем получилось 2 байта))) так делать просто нельзя или проблема из-за перовго вопроса ?)
C++
1
2
3
struct uint48t {
    u_int64_t v:48;
} __attribute__((packed));
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
07.12.2015, 14:54 #4
Цитата Сообщение от Fobes Посмотреть сообщение
unsigned char a[5]; не предлагать
понятное дело - ведь тогда будет 5-и байтовый инт, а не 6-и ))))
0
Fobes
16 / 16 / 5
Регистрация: 19.09.2012
Сообщений: 212
07.12.2015, 16:35  [ТС] #5
Собственно частично вопросы решились:
Получилось сделать 6 байтный int) вроде все работает нормально)))) Глядишь кому поможет)
C++
1
2
3
4
5
6
7
8
9
10
u_int64_t   ts_sec:48;
 
//байты после приведения можно переставить так
#define __bswap_constant_48(x) \
     (__extension__ ((((x) & 0xff0000000000ull) >> 40)        \
             | (((x) & 0x00ff00000000ull) >> 24)              \
             | (((x) & 0x0000ff000000ull) >> 8)         \
             | (((x) & 0x000000ff0000ull) << 8)         \
             | (((x) & 0x00000000ff00ull) << 24)              \
             | (((x) & 0x0000000000ffull) << 40)))
Но вот первый вопрос по прежнему актуален... При использовании unsigned char p64[8]; за место u_int64_t p64; все работает правильно... Стоит вернуть обратно как все расползается... в чем может быть проблема ?

rikimaru2013, а по существу есть что сказать может ?)
0
07.12.2015, 16:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2015, 16:35
Привет! Вот еще темы с решениями:

Неверный вывод байтов int-а при приведении его до char*
template&lt;typename T&gt; void print_bytes(T val) { for (size_t i = 0; i &lt;...

Меняется ответ при приведении функции pow к unsigned long long
Тест: 50 50 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...

Преобразование типов при наследовании
Здравствуйте! Никак не получается разобраться с проблемой. Храню в...

Куда деваются вирусы при удалени программы Dr.Web
Всеи привет! Ребзя подскажите мож кто знает, Часто пользуюсь Dr.Web Cureit и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru