C / C ++ Побитовое ИЛИ и как его интерпретировать

0

Я понятия не имею о побитом ИЛИ.

Итак, вот моя проблема. Я использую библиотеку libsndfile. Я использую его для чтения аудиофайлов. Мне нужно сообщить битрейт аудиофайла.

Я прочитал 24-битный звуковой файл wav. Api предоставляет формат поля, который установлен в формат = 65539.

Документация говорит мне следующее:

Поле формата в вышеприведенной структуре SF_INFO составлено из битового OR основного формата (значения от 0x10000 до 0x08000000), малогабаритного типа (со значениями менее 0x10000) и дополнительного значения endian-ness.

Вот некоторые возможные значения:

      SF_FORMAT_WAV          = 0x010000,     /* Microsoft WAV format (little endian). */
      SF_FORMAT_AIFF         = 0x020000,     /* Apple/SGI AIFF format (big endian). */
      SF_FORMAT_AU           = 0x030000,     /* Sun/NeXT AU format (big endian). */
      SF_FORMAT_RAW          = 0x040000,     /* RAW PCM data. */
      SF_FORMAT_PAF          = 0x050000,     /* Ensoniq PARIS file format. */
      SF_FORMAT_SVX          = 0x060000,     /* Amiga IFF / SVX8 / SV16 format. */
      SF_FORMAT_NIST         = 0x070000,     /* Sphere NIST format. */
      SF_FORMAT_VOC          = 0x080000,     /* VOC files. */
      SF_FORMAT_IRCAM        = 0x0A0000,     /* Berkeley/IRCAM/CARL */
      SF_FORMAT_W64          = 0x0B0000,     /* Sonic Foundry 64 bit RIFF/WAV */
      SF_FORMAT_MAT4         = 0x0C0000,     /* Matlab (tm) V4.2 / GNU Octave 2.0 */
      SF_FORMAT_MAT5         = 0x0D0000,     /* Matlab (tm) V5.0 / GNU Octave 2.1 */
      SF_FORMAT_PVF          = 0x0E0000,     /* Portable Voice Format */
      SF_FORMAT_XI           = 0x0F0000,     /* Fasttracker 2 Extended Instrument */
      SF_FORMAT_HTK          = 0x100000,     /* HMM Tool Kit format */
      SF_FORMAT_SDS          = 0x110000,     /* Midi Sample Dump Standard */
      SF_FORMAT_AVR          = 0x120000,     /* Audio Visual Research */
      SF_FORMAT_WAVEX        = 0x130000,     /* MS WAVE with WAVEFORMATEX */
      SF_FORMAT_SD2          = 0x160000,     /* Sound Designer 2 */
      SF_FORMAT_FLAC         = 0x170000,     /* FLAC lossless file format */
      SF_FORMAT_CAF          = 0x180000,     /* Core Audio File format */
      SF_FORMAT_WVE          = 0x190000,     /* Psion WVE format */
      SF_FORMAT_OGG          = 0x200000,     /* Xiph OGG container */
      SF_FORMAT_MPC2K        = 0x210000,     /* Akai MPC 2000 sampler */
      SF_FORMAT_RF64         = 0x220000,     /* RF64 WAV file */

      /* Subtypes from here on. */

      SF_FORMAT_PCM_S8       = 0x0001,       /* Signed 8 bit data */
      SF_FORMAT_PCM_16       = 0x0002,       /* Signed 16 bit data */
      SF_FORMAT_PCM_24       = 0x0003,       /* Signed 24 bit data */
      SF_FORMAT_PCM_32       = 0x0004,       /* Signed 32 bit data */

Мой большой вопрос: как я могу проанализировать формат = 65539, чтобы рассказать об основном типе и подтипе?

Большое спасибо заранее.

Теги:
bit-manipulation

2 ответа

3
Лучший ответ

Вам нужно определить диапазоны бит для разных частей, которые вам интересны. Глядя на список, в подтип есть 2 шестнадцатеричных разряда, предназначенных для основного типа и 4 цифры. Используйте AND (&), чтобы разбить их.

major = type & 0xff0000;
subtype = type & 0x00ffff;
  • 0
    Огромное спасибо. Это было очень полезно и именно то, что мне нужно. взяв ваш код, я могу проанализировать, как если (подтип == SF_FORMAT_PCM_16) битрейт = 16; иначе if (подтип == SF_FORMAT_PCM_24) битрейт = 24;
6

Просто подключите его в свой калькулятор на рабочем столе и преобразуйте в шестнадцатеричный:

65539 == 0x010003

То есть:

65539 == (0x010000) | (0x3)

который выглядит как SF_FORMAT_WAV | SF_FORMAT_PCM_24 SF_FORMAT_WAV | SF_FORMAT_PCM_24.

  • 0
    это место на Спасибо. Очень полезно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню