Обратный алгоритм упаковки битов - PullRequest
2 голосов
/ 10 февраля 2012

Я пытаюсь изменить алгоритм, который у меня есть, который упаковывает кучу неподписанных шорт в память. Я попытался повернуть вспять, и я получаю правильные числа обратно 50% - 75% времени, поэтому я не уверен, что я делаю неправильно.

Это алгоритм для упаковки чисел в память:

BYTE packNumber(BYTE bStart, WORD value, BYTE * buffer, DWORD * counter)
{
    value = (value<<(6-bStart));
    *(buffer + *counter) |= (BYTE)(value>>8);
    *(buffer + *counter+1) |= (BYTE)value;

    bStart = (bStart+2)%8;

    if (bStart)
        *counter+= 1;
    else
        *counter+= 2;

    return bStart;
}

Это вызывается несколько раз подряд, передавая возвращенный bStart в следующий вызов, пока все числа не будут упакованы в память.

Это моя попытка изменить его:

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter)
{
    *value= 0;

    *value|= *(buffer + *counter);
    *value= *value<< 8;
    *value|= *(buffer + *counter+1);

    *wVal = (*value>>(6-bStart));

    bStart = (bStart+2)%8;

    if (bStart)
        *counter+= 1;
    else
        *counter+= 2;

    return bStart;
}

Я знаю, что делаю что-то правильно, так как я получаю кучу правильных данных, хотя в зависимости от чисел, которые я записал в память, что-то от каждого четвертого до каждого второго считанного числа неверно.

Есть идеи, что я здесь не так делаю?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Просто быстро посмотрев на код, похоже, он должен работать как WORD без знака .

Я бы почти поспорил, что это не так, и ваши сдвиги в конечном итоге будут подписаны (и, следовательно, сдвинутые старшие биты будут не нулем, а копиями знакового бита)

Редактировать: Также, поскольку вы хотите получить 10 битов, вы, вероятно, должны удалить возможные дополнительные старшие биты с помощью * wVal & = 0x03ff.

Это похоже на то, что WORD будет беззнаковым коротким;

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter)
{
    *value= 0;

    *value|= *(buffer + *counter);
    *value= *value<< 8;
    *value|= *(buffer + *counter+1);

    *value = (*value>>(6-bStart)) & 0x3ff; // <-- remove extraneous bits

    bStart = (bStart+2)%8;

    if (bStart)
        *counter+= 1;
    else
        *counter+= 2;

    return bStart;
}
0 голосов
/ 10 февраля 2012

Ой, твой код на C немного болит голова.Вы утверждаете какие-либо из ваших условий входа?То, как вы пишете в ОЗУ, просто страшно без проверок.Кроме того, если bStart больше 6, ваш сдвиг не определен.Я думаю, что bStart> 6 это ваша проблема.Кстати, это совсем не код C ++, это просто C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...