Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.88
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
#1

Побитовое чтение - C++

24.07.2012, 21:42. Просмотров 5251. Ответов 17
Метки нет (Все метки)

Есть файл видео и мне известна его структура.
Например структура следующая:
8 бит
1 бит
1 бит
1 бит
13 бит
и т.д.
Как мне считать данные побитово? Или можно только считывать побайтово и выделять потом биты? Если побайтово, то как потом выделить биты из него? Можете объяснить, ну и показать пару примеров.
Заранее благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2012, 21:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Побитовое чтение (C++):

Побитовое чтение/запись в файл - C++
Добрый день. Мне нужно реализовать класс, который дает возможность побитовой записи/четения в/из файла. Я на самом деле не очень хорошо...

Открытие и побитовое чтение jpeg-файла - C++
Здравствуйте уважаемые участники форума. Прошу подсказать, как лучше справиться с задачей. Собственно нужно открыть jpeg-файл и...

какая функция осуществляет побитовое чтение файла - C++
какая функция осуществляет побитовое чтение файла подскажите кто знает ...

Побитовое сравнение - C++
Дан массив с десятичными числами, как сравнить (2ой,3ий,4ый и т.д.) бит 7 элемента с 1 элементом.

Побитовое вычитание - C++
Здравствуйте. Задача сложить переменные, содержащих 2 машинных слова, используя только логические операции. Получилось такое чудо, однако...

Побитовое замещение - C++
Не могу что-то догнать. Есть int 0x 00 00 00 00 Как наиболее простым способом заместить одну из пар 4 бит другой? set( 1, 0x56 ) ...

17
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2012, 21:53 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <fstream>
 
struct VideoPacketHeader
{
  unsigned m1 : 8;
  unsigned m2 : 1;
  unsigned m3 : 1;
  unsigned m4 : 1;
  unsigned m5 : 13;
};
 
int main () {
  std::ifstream f ("file.mkv");
  if (!f) return -1;
  
  VideoPacketHeader hdr;
  f.read ((char*)&hdr, sizeof(hdr));
}
битовые поля
но вообще есть еще вопросы с выравниванием и упаковкой
1
canopen
415 / 416 / 12
Регистрация: 16.07.2012
Сообщений: 886
24.07.2012, 21:54 #3
http://chipenable.ru/index.php/progr...vr-define.html
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2012, 22:29 #4
зачем, если для этого есть битовые поля?
0
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
25.07.2012, 00:51  [ТС] #5
Еще есть небольшой вопрос. Мне надо парсить Transport Stream. Вот его структура
transport_packet()
{
sync_byte : 8
transport_error_indicator : 1
payload_unit_start_indicator : 1
transport_priority : 1
PID : 13
transport_scrambling_control : 2
adaptation_field_control : 2
continuity_counter : 4
if(adaptation_field_control = = '10' || adaptation_field_control = = '11')
{
adaptation_field()
}
if(adaptation_field_control = = '01' || adaptation_field_control = = '11')
{
for (i = 0; i < N; i++)
{
data_byte
}
}
}
Как теперь считать данные битово понятно, но как мне теперь правильно сравнить значение поля adaptation_field_control с '10' или '01'?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.07.2012, 01:14 #6
pkt.adaptation_field_control == 2 || pkt.adaptation_field_control = 3

тут 2 бита - арифметика банальная

еще один момент - размер структуры - 32 бита, то бишь 4 байта
для 32 размерной системы все будет ок, но на 64 она будет выравнена до 64 бит
чтобы такого не происходило следует использовать pragma'ы своего компилятора (чтото вроде pragma pack)
1
alkagolik
Заблокирован
25.07.2012, 01:28 #7
так вроде же '10' == 0, а не 2.
Цитата Сообщение от alex_x_x Посмотреть сообщение
(чтото вроде pragma pack)
или __attribute__((packed)) для гнутых.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.07.2012, 01:34 #8
alkagolik, каким образом?
я полагаю, что это 102
0
alkagolik
Заблокирован
25.07.2012, 01:35 #9
alex_x_x, ну я в замешательстве. Я ставлю акцент на кавычки, если код так написан, то '10' == 0
0
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
25.07.2012, 09:36  [ТС] #10
Возникла еще одна проблема с чтением
Если мне надо считать не в структура, а только в одной поле структуры, то как в этом случае считывать?
Пытался сделать так
C++
1
fin.read((char*)hdr.transport_error_indicator, sizeof(hdr.transport_error_indicator)
Но выдается ошибка при компиляции. Да и sizeof возвращет байты. Как решить такую проблему?

Добавлено через 9 минут
А в unsigned запишется поле длинной 33 бита?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.07.2012, 10:57 #11
Khelleos, нет, так не бывает
в машинах биты не существуют отдельно от байтов
хотя бы ваша файловая.система и драйвер жесткого диска побитовое чтение не поддерживает
1
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
25.07.2012, 11:39  [ТС] #12
Тогда как мне реазлизовать следующий код

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
adaptation_field() 
{
   adaptation_field_length (8)
   if (adaptation_field_length > 0) 
   {
      discontinuity_indicator (1)
      random_access_indicator (1)
      elementary_stream_priority_indicator (1)
      PCR_flag (1)
      OPCR_flag (1)
      splicing_point_flag (1)
      transport_private_data_flag (1)
      adaptation_field_extension_flag (1)
      if (PCR_flag = = '1')                                              
      {
         program_clock_reference_base (33)
         reserved (6)
         program_clock_reference_extension (9)
      }
      if (OPCR_flag = = '1') 
      {
         original_program_clock_reference_base (33)
         reserved (6)
         original_program_clock_reference_extension (9)  
      }
      if (splicing_point_flag = = '1') 
      {
         splice_countdown (8)
      }
      if (transport_private_data_flag = = '1') 
      {
         transport_private_data_length (8)
         for (i = 0; i < transport_private_data_length; i++) 
         {
            private_data_byte (8)
         }
      }
      if (adaptation_field_extension_flag = = '1') 
      {
         adaptation_field_extension_length (8)
         ltw_flag (1)
         piecewise_rate_flag (1)
         seamless_splice_flag (1)
         reserved (5)
         if (ltw_flag = = '1') 
         {
            ltw_valid_flag (1)
            ltw_offset (15)
         }
         if (piecewise_rate_flag = = '1') 
         {
            reserved (2)
            piecewise_rate (22)
         }
         if (seamless_splice_flag = = '1') 
         {
            splice_type (4)
            DTS_next_AU[32..30] (3)
            marker_bit (1)
            DTS_next_AU[29..15] (15)
            marker_bit (1)
            DTS_next_AU[14..0] (14)
            marker_bit (1)
         }
         for (i = 0; i < N; i++) 
         {
            reserved (8)
         }
      }
   }
   for (i = 0; i < N; i++) 
   {
      stuffing_byte (8)
   }
}
В скобках указано количество бит

Добавлено через 2 минуты
Думал, реализовать несколько структур для каждого условия, но не слишком ли это? По мне так это будет некрасиво иметь для каждого условия структуру, особенно там где только одно поле. Кстати, а что делать с полем 33 бита? Оно разве запишеться в unsigned?
0
Jupiter
25.07.2012, 11:45
  #13

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
или __attribute__((packed)) для гнутых.
http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

1
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
25.07.2012, 12:12  [ТС] #14
Походу единственный способ - это считывать побайтово, а потом разбирать каждый байт на нужные биты.
А вот тогда лучше ответьте мне на такой вопрос.
Есть поле длиной 13 бит. Я считаю это поле в 2 байта. Впервом байте я беру 8 бит(то есть весь байт), а из второго 5 бит. если я потом сложу переменные, в которые я записал 8 и 5 бит, то я получу нужное мне поле(13 бит), да?
0
canopen
415 / 416 / 12
Регистрация: 16.07.2012
Сообщений: 886
25.07.2012, 12:17 #15
Нет, не получите. Вам сначала нужно будет сдвинуть 8 бит на пять разрядов влево, а 5 бит на три разряда вправо. Прочитали бы все-таки что-нибудь на тему битовых операций.
1
25.07.2012, 12:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2012, 12:17
Привет! Вот еще темы с ответами:

побитовое увеличение - C++
Здравствуйте уважаемые пользователи. Это моя первая тема. Собственно суда я пришел за помощью. Так вот. Как побитово увеличить любое...

Побитовое представление числа. - C++
Всем привет, подскажите пожалуйста, нужно: Написать программу, которая принимает с клавиатуры число x, имеющее тип unsigned char и...

Побитовое представление числа - C++
Добрый вечер, подскажите, пожалуйста, каким образом можно сформировать число из нужных мне битов, скажем, есть 4 бита (0, 0, 0, 1), далее...

Побитовое считывание файла - C++
Стоит задача: Дан начальный файл любого формата (mp3,avi, и т.д.) Требуется считать его содержимое и представить его в виде битовой...


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

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

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