HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Битовые сдвиги, нужна помощь
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



Битовые сдвиги, нужна помощь

Есть такая структура:

C++ Source Code:
1
// TS packet: 188 bytes, 4 bytes header, 184 bytes payload
2
struct video_head {
3
  uint32_t startcode:32;
4
  uint32_t hSize:13;
5
  uint32_t vSize:13;
6
  ...
7
};
8
 


Проблема в том, что там обратный порядок битов.

т.е. я не могу просто взять и вывести:
C++ Source Code:
video_head *pTest = buff;
printf( "Test: %d\n", pTest->hSize );

Приходится использовать:

C++ Source Code:
unsigned short hSize = (buff[i+2] << 8 | buff[i+3]) & 0x1fff;


Вопрос в том, как поменять порядок битов для vSize, чтобы тоже был верный результат.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей

Сообщить модератору | IP: Записан
Сообщение: 136093

Старое сообщение 05-04-2014 09:27
- За что?
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 13504
Возраст: 33

Рейтинг



Вообще странная запись структуры.
Как я понял там что то вроде такого:
your_group x;
int line_id = 2;
long pos;

pos = (line_id) * sizeof(your_group) + sizeof(int);
fseek(file, pos, SEEK_SET);

fread(&x, sizeof(your_group), 1, file);

Хотелось бы самому понять как адекватно работать со структурами, и каким образом там хранятся байты (я так понял так же как и в массиве?). Я вот посмотрел в юнионах так вообще самый последний элемент затирает предыдущие (и ДМ помог). Си только начал учить, тапками не кидаться .

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Отредактировано FiEctro 05-04-2014 в 09:51

Сообщить модератору | IP: Записан
Сообщение: 136094

Старое сообщение 05-04-2014 09:43
- За что?
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1086

Рейтинг



Что за buff, какого он типа? А пытаясь вытащить что-то из buff, который, видимо, иного типа чем video_head, ты рискуешь натолкнуться на выравнивание структуры (биты между некоторыми полями могут не использоваться).

Сообщить модератору | IP: Записан
Сообщение: 136095

Старое сообщение 05-04-2014 09:46
- За что?
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



Не думаю, что там есть выравнивание.

buff = это просто буфер, набор unsigned char

А сама структура: http://en.wikipedia.org/wiki/Elementary_stream
Header for MPEG-2 video elementary stream

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей

Сообщить модератору | IP: Записан
Сообщение: 136096

Старое сообщение 05-04-2014 10:14
- За что?
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1086

Рейтинг



Так там же по 12 бит, а не по 13.
Каждая шестнадцатиричная цифра соответствует 4 битам, так что можешь посмотреть, что там получается при чтении и приводить к нужному виду. Я не совсем понял, что ты подразумеваешь под обратным порядком. Есть little и big-endian, а уж какой из них обратный - это относительно.
В общем выводи так и разбирайся:

C++ Source Code:
for (i=0; i<count; ++i)
  printf("%02x", buf[i]);


Заодно посмотришь, есть ли там незначащие биты.

Сообщить модератору | IP: Записан
Сообщение: 136098

Старое сообщение 05-04-2014 11:27
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 11:53. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Битовые сдвиги, нужна помощь
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024