Обратная функция
От: Аноним  
Дата: 21.11.09 14:15
Оценка: :))) :))
Привет. помогите, пожалуйста, найти обратную функцию преобразования от
int Decode(unsigned char* c, int nDigits)
{
    int nValue = 0;

    for(int n = 0; n < nDigits; ++n)
        nValue = ( nValue << 8 ) | *(c+n);

    return nValue;
};
Re: Обратная функция
От: rg45 СССР  
Дата: 21.11.09 14:53
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Привет. помогите, пожалуйста, найти обратную функцию преобразования от

А>
А>int Decode(unsigned char* c, int nDigits)
А>{
А>    int nValue = 0;

А>    for(int n = 0; n < nDigits; ++n)
А>        nValue = ( nValue << 8 ) | *(c+n);

А>    return nValue;
А>};
А>


void Encode(int Value, unsigned char* c, int nDigits)
{
  for(unsigned char* p = c + nDigits; p != c; )
  {
    *--p = Value & 0xff;
    Value >>= 8; 
  }
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Обратная функция
От: Кодт Россия  
Дата: 22.11.09 23:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет. помогите, пожалуйста, найти обратную функцию преобразования от

А>
А>int Decode(unsigned char* c, int nDigits)
А>{
А>    int nValue = 0;

А>    for(int n = 0; n < nDigits; ++n)
А>        nValue = ( nValue << 8 ) | *(c+n);

А>    return nValue;
А>};
А>

Функция рассматривает хвост массива c как (неявно беззнаковое) целое старшими разрядами вперёд.
Поэтому для nDigits>=4 это эквивалентно ntohl(*(long*)(c+nDigits-4)), а для nDigits==2 — ntohs(*(short*)c)... Только без проблем с выравниванием, естественно.

Если эта функция применяется именно для трансляции big-endian чисел в родное представление, то проще всего не морочить голову ни себе, ни людям и использовать ntohs/ntohl.
А если это какая-то криптография — выкинуть к чёрту.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.