Привет. помогите, пожалуйста, найти обратную функцию преобразования от
int Decode(unsigned char* c, int nDigits)
{
int nValue = 0;
for(int n = 0; n < nDigits; ++n)
nValue = ( nValue << 8 ) | *(c+n);
return nValue;
};
Здравствуйте, Аноним, Вы писали:
А>Привет. помогите, пожалуйста, найти обратную функцию преобразования от
А>А>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;
}
}
Здравствуйте, Аноним, Вы писали:
А>Привет. помогите, пожалуйста, найти обратную функцию преобразования от
А>А>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.
А если это какая-то криптография — выкинуть к чёрту.