Re[2]: Использование переменных цикла после цикла
От: kov_serg Россия  
Дата: 23.09.23 12:02
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Вот ещё вопрос по близкому коду, чтобы не создавать тему. Мне надо перевести эту функцию на Delphi:


K>
K>static int receivebits(int buf[], int num_of_bits) {

K>    int cnt, num; 
K>    unsigned int lastbits, lastbyte;
K>    unsigned char * cbuf;
K>    int mask = (1 << num_of_bits) -1;

K>    cbuf = ((unsigned char *)buf) + 3 * sizeof(*buf);
K>    cnt = buf[0];
K>    lastbits = (unsigned int) buf[1];
K>    lastbyte = (unsigned int) buf[2];
    
K>    num = 0;
K>    while (num_of_bits >= 8) {
K>    lastbyte = ( lastbyte << 8 ) | cbuf[cnt++];
K>    num |=  (lastbyte >> lastbits) << (num_of_bits - 8);
K>    num_of_bits -=8;
K>    }
K>    if (num_of_bits > 0) {
K>    if (lastbits < num_of_bits) {
K>        lastbits += 8;
K>        lastbyte = (lastbyte << 8) | cbuf[cnt++];
K>    }
K>    lastbits -= num_of_bits;
K>    num |= (lastbyte >> lastbits) & ((1 << num_of_bits) -1);
K>    }
K>    num &= mask;
K>    buf[0] = cnt;
K>    buf[1] = lastbits;
K>    buf[2] = lastbyte;
K>    return num; 
K>}
K>

Тут же очевидный код написан. Оно просто вместо нормально структуры использует массив. Ну не было тогда в фортране структур.
struct {
  int cnt; // текущая позиция в buf
  int lastbits; // кол-во бит в аккумуляторе
  int lastbyte; // аккумулятор
  char buf[]; // поток данных
};

оно просто выколупывет заданное количество бит из потока.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.