Здравствуйте, 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[]; // поток данных
};
оно просто выколупывет заданное количество бит из потока.