192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
||||||
1 | ||||||
"Проецирование" массива байт на структуру26.01.2017, 12:32. Показов 1886. Ответов 13
Метки нет (Все метки)
Допустим, есть некая структура и массив байт. Безопасно и корректно ли будет кастовать массив к структуре, чтоб удобно управлять нужными байтами через структуру?
0
|
26.01.2017, 12:32 | |
Ответы с готовыми решениями:
13
Проецирование массива в память Как заставить программу принимать цепочку байт из оперативной памяти, в виде массива байт ? Вычесть из одного массива байт другой массив байт Массив байт преобразовать в структуру |
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
|
|
26.01.2017, 12:56 | 2 |
0
|
Модератор
13710 / 10910 / 6476
Регистрация: 18.12.2011
Сообщений: 29,133
|
|
26.01.2017, 12:58 | 3 |
У вектора нет метода прямого доступа к данным.
Более того, vec[0] и vec[1] не обязаны находиться друг за другом. А вот к char[13] можете применить эту методику без зазрения совести.
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
26.01.2017, 13:02 | 4 |
0
|
Модератор
13710 / 10910 / 6476
Регистрация: 18.12.2011
Сообщений: 29,133
|
|
26.01.2017, 13:04 | 5 |
С оговоркой:
0
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
|
|
26.01.2017, 13:30 | 6 |
В векторе как раз таки обязаны. Формальное отсутствие такой гарантии в самой первой версии С++98 было сразу признанно дефектом и исправлено еще тогда.
1
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
26.01.2017, 13:31 [ТС] | 7 |
такая запись - UB?
а разве вектор не аллоцирует непрерывный кусок памяти? он ведь позиционируется, как замена массива
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
26.01.2017, 14:17 | 8 |
Сообщение было отмечено Selot как решение
Решение
обязаны
Добавлено через 3 минуты в данном случае - корректно. однако за свои удобства вы заплатите эффективностью. доступ к полям пакованной структуры может быть намного медленнее, чем доступ к структуре с выравниванием.
2
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
|
|
26.01.2017, 19:41 | 9 |
В языке С++ из нетривиальных реинтерпретаций разрешается только реинтепретировать любой объект, как массив char или unsigned char (с целью чтения или модификации через массив char или unsigned char). Но не наоборот. Обратная реинтерпретация не допускается, т.е. не допускается реинтерпретация массива байтов, как объекта другого типа. То есть именно то, что вы пытаетесь делать - формально недопустимо.
Понятно, что такие драконовские ограничения не дают нам возможности даже создавать свои аллокаторы, но формально ограничения именно таковы.
1
|
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
|
|
27.01.2017, 11:20 [ТС] | 10 |
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
27.01.2017, 11:35 | 11 | |||||
на этом основана конструкция множества различных врапперов,
которые аллоцируют объекты во внутренних чаровых хранилищах, хотите сказать, что следующий код содержит UB? http://rextester.com/MRZ31868
1
|
25 / 25 / 5
Регистрация: 04.01.2017
Сообщений: 52
|
||||||
29.01.2017, 16:48 | 12 | |||||
hoggy, можете объяснить что в этой строке
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
29.01.2017, 16:58 | 13 |
FHelio,
Надеюсь хогги не сильно обидется если я отвечу за него Это placement new После new можно поставить круглые скобки и передать туда участок памяти в котором должен быть размещен объект sample На этот участок памяти в данном случае указывает buff. Память куда указывает buff должен быть не менее чем sizeof(sample) что бы вместить экземпляр класса
1
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
30.01.2017, 11:46 | 14 | |||||
3
|
30.01.2017, 11:46 | |
30.01.2017, 11:46 | |
Помогаю со студенческими работами здесь
14
Скопировать массив байт в структуру Число типа real (6 байт). Сделать структуру данных которая показала бы значение каждого байта этого числа Найти максимальный элемент массива и записать его в Rg BH (формат элементов массива - байт). Десериализация массива байт Шифрование массива байт Буферизация массива байт Обьявление массива байт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |