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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> void* буфер 
V
    Опции темы
Apel
Дата 9.11.2010, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть буфер переменной длины типа void*, в него попадает пакет данных, в котором есть фиксированный заголовок и хвост переменной длины (массив значений). Длина этого массива передаётся в заголовке. А как получить доступ к произвольному элементу массива или всего буфера? Не получается присвоить указателю на нужный тип адрес буфера + смещние.

Это сообщение отредактировал(а) Apel - 15.11.2010, 12:32
PM MAIL   Вверх
boostcoder
Дата 9.11.2010, 06:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Код


void* void_buffer = ...
char* char_buffer = static_cast<char*>(void_buffer);
char* need_byte = char_buffer+4;

PM WWW   Вверх
Apel
Дата 9.11.2010, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



char* не пойдёт, потому что там могут попадаться \0 и данные занимают не всегда 1 байт. мне нужно доставать из буфера char*, __int8, __int16 из произваольного места.

я делал вот как: объявлял структуру, описывающую заголовок, затем  приводил void* к указателю на эту структуру. Я могу читать все поля, кроме массива, размер которого может меняться. Если в структуру жёстко добавить массив, то и его можно прочитать. но он же может быть разной длины
PM MAIL   Вверх
Artemon
Дата 9.11.2010, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



Цитата

char* не пойдёт, потому что там могут попадаться \0


И что с этого ? Ты вседь не собираешься использовать эти данные как строку.

Цитата

Я могу читать все поля, кроме массива, размер которого может меняться.


Вместе с заголовком у тебя передается длина массива и ты знаешь длину заголовочной структуры.  Сделай смещение с начала полученных данных на длину заголовка, с этого места у тебя пойдет твой массив переменной длины. Чтобы получить из него произвольное значение, лелай смещение равное Index * sizeof( ТИП )


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Apel
Дата 9.11.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вопрос не в том как посчитать смещение, оно тут не работает, не работает если к адресу указателя прибавить смещение, привести к нужному типу и обработать.  вылазит ошибка что размер типа void н5 известен. можно только "куском" привести к нужному типу без смещения. Вопрос как это обойти не прибегая к созданию структуры (типа) максимального допустимого размера, который может быть в буфере.
PM MAIL   Вверх
mes
Дата 9.11.2010, 11:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Apel @  9.11.2010,  10:39 Найти цитируемый пост)
 вылазит ошибка что размер типа void н5 известен.

оперировать не с void*, а с char*.. как уже советовали выше..



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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