Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение N-битовыми порциями из входного массива 
:(
    Опции темы
zaytsewa
Дата 24.12.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задача вроде бы не сложная. Есть входной массив в байтах. Надо считывать из него порциями указанной в битах последовательно. Длина порций может меняться.
Функция считывания порции данных указанной длины вызывается в цикле, пока данные во входном буфере не закончатся. Максимальная длина порции - 16 бит, минимальная -9.


вот функция считывания порции данных :

/
Код

* чтение порции данных*/
  bool ReadBits(unsigned short &code, unsigned short bits)
  {
    unsigned short n_bits; //кол-во свободных бит до конца байта 1
    unsigned short bshift; // сдвиг от начала нулевого байта
    unsigned short BytePos;  // номер текущего байта

    BytePos = IPos >> 3;   // номер первого байта, прочитанного не до конца
    bshift = IPos % 8;   // сдвиг от начала байта - с какого бита читать
    IPos += bits;    // сдвигаем на CodeLen = 9  бит для след итерации

    if (IPos > ISize) {printf("\nIPos=%ld\n",IPos);return false;} // проверка на выход за границы входного массива
    
    n_bits = 16 - bshift - bits;  // кол-во свободных бит до конца байта 1
    
    unsigned char byte0 = (unsigned char)IBuffer[BytePos] & b_mask(8 - bshift);

    code = (unsigned short)byte0 << ( 8 - n_bits);  // сдвигаем код байта 0 вперёд 
    ++BytePos;         // переходим к след байту
    
    unsigned char byte1 = (unsigned char)IBuffer[BytePos] >> n_bits;

    code |= (unsigned short)(byte1); 
    
    printf("\nbits = %d shift = %d byte0 = %d byte1 = %d n_bits = %d\n",bits,bshift,byte0,byte1,n_bits);
    
    //if (DEBUG) printf("\ncode = %d\n",code);
    return true;
  }


в программе она вызывается так:

 
Код

   while ((ReadBits(code, CodeLen)) && (OPos < OSize))    // пока входной поток не пуст
    {...}


почему-то возникает такая ситуация :
bits = 10 shift = 7 byte0 = 0 byte1 = 0 n_bits = 65535


ну т.е.     n_bits = 16 - bshift - bits;  // кол-во свободных бит до конца байта 1 возвращает -1

непонятно... Объясните, пожалуйста, что я не так делаю.




PM MAIL   Вверх
xvr
Дата 24.12.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Если 'Максимальная длина порции - 16 бит' то эта 'порция' может пересекать 3 байта. У вас берется максимум 2

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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