number_convert.inc
Number Conversions
VIP Сървъри
Всички сървъри
/*
// Number Conversions
// by Exolent
stock HexToDecimal( const szHex[ ] )
stock DecimalToHex( const iDecimal, szHexResult[ ], const iHexLen )
stock BinaryToDecimal( const szBinary[ ] )
stock DecimalToBinary( const iDecimal, szBinary[ ], const iBinaryLen )
stock BinaryToHex( const szBinary[ ], szHexResult[ ], const iHexLen )
stock HexToBinary( const szHex[ ], szBinaryResult[ ], const iBinaryLen )
// Retrives digits from a given value and returns the number of digits
//
// @param iValue - The value from which to get the digits
// @param iDigits[ ] - The array to store the digits in (optional)
// @param iDigitSize - The size of the array (optional)
// @param iBase - The base of the number to find digits by (default is 10 for base 10 (decimal)) (optional)
// @param bKeepDigitOrder - Decides to start from the right side of the decimal or left (default is false) (optional) (see post for more details)
//
// @return The total number of digits found
//
stock GetDigits( const iValue, iDigits[ ] = "", const iDigitSize = 0, const iBase = 10, bool:bKeepDigitOrder = false )
stock ReverseArray( iArray[ ], const iSize )
*/
#include < amxmodx >
#if cellbits == 32
#define MAX_DECIMAL_DIGITS 10
#define MAX_BINARY_DIGITS 31
#define MAX_HEXADECIMAL_DIGITS 8
#else
#define MAX_DECIMAL_DIGITS 19
#define MAX_BINARY_DIGITS 63
#define MAX_HEXADECIMAL_DIGITS 16
#endif
stock const __HEXCHARS[ ] = "0123456789ABCDEF";
stock HexToDecimal( const szHex[ ] )
{
new iLen = strlen( szHex );
new iPos = 0;
new cChar;
new iValue;
new iResult = 0;
while( --iLen >= 0 )
{
cChar = szHex[ iLen ];
switch( cChar )
{
case '0' .. '9':
{
iValue = cChar - '0';
}
case 'a' .. 'f':
{
iValue = 10 + cChar - 'a';
}
case 'A' .. 'F':
{
iValue = 10 + cChar - 'A';
}
default:
{
return -1;
}
}
iResult += ( power( 16, iPos++ ) * iValue );
}
return iResult;
}
stock DecimalToHex( const iDecimal, szHexResult[ ], const iHexLen )
{
new iTotal = GetDigits( iDecimal, szHexResult, iHexLen, 16, true );
for( new i = 0; i < iTotal; i++ )
{
szHexResult[ i ] = __HEXCHARS[ szHexResult[ i ] ];
}
szHexResult[ iTotal ] = 0;
return iTotal;
}
/*stock BinaryToDecimal( const iBinary )
{
new iResult = 0;
new iTemp = iBinary;
new iValue;
new iPos;
while( iTemp > 0 )
{
iValue = iTemp % 10;
if( iValue )
{
iResult |= ( 1 << iPos++ );
}
iTemp /= 10;
}
return iResult;
}
stock DecimalToBinary( const iDecimal )
{
new iResult = 0;
for( new i = MAX_BINARY_DIGITS - 1, iBit = 1 << i; i >= 0; iBit = 1 << ( --i ) )
{
if( iDecimal & iBit )
{
iResult += power( 10, i );
}
}
return iResult;
}*/
stock BinaryToDecimal( const szBinary[ ] )
{
new cChar;
new iPos = 0;
new iResult = 0;
while( ( cChar = szBinary[ iPos ] ) )
{
if( cChar == '1' )
{
iResult |= ( 1 << iPos );
}
else if( cChar != '0' )
{
return -1;
}
iPos++;
}
return iResult;
}
stock DecimalToBinary( const iDecimal, szBinary[ ], const iBinaryLen )
{
new iLen = 0;
for( new i = min( MAX_BINARY_DIGITS - 1, iBinaryLen ), iBit = 1 << i; i >= 0; iBit = 1 << ( --i ) )
{
if( iDecimal & iBit )
{
szBinary[ iLen++ ] = '1';
}
else if( iLen )
{
szBinary[ iLen++ ] = '0';
}
}
szBinary[ iLen ] = 0;
return iLen;
}
/*stock BinaryToHex( const iBinary, szHexResult[ ], const iHexLen )
{
new iByteDigits[ MAX_BINARY_DIGITS / 4 ];
new iTotal = GetDigits( iBinary, iByteDigits, sizeof( iByteDigits ), 10000, true );
new iPos;
for( new i = 0; i < iTotal && iPos < iHexLen; i++ )
{
iPos += DecimalToHex( BinaryToDecimal( iByteDigits[ i ] ), szHexResult[ iPos ], iHexLen - iPos );
}
szHexResult[ iPos ] = 0;
return iPos;
}
stock HexToBinary( const szHex[ ] )
{
new iLen = strlen( szHex );
new iPos;
new cChar;
new iValue;
new iResult = 0;
while( --iLen >= 0 )
{
cChar = szHex[ iLen ];
switch( cChar )
{
case '0' .. '9':
{
iValue = cChar - '0';
}
case 'a' .. 'f':
{
iValue = 10 + cChar - 'a';
}
case 'A' .. 'F':
{
iValue = 10 + cChar - 'A';
}
default:
{
return -1;
}
}
iResult += DecimalToBinary( power( 16, iPos++ ) * iValue );
}
return iResult;
}*/
stock BinaryToHex( const szBinary[ ], szHexResult[ ], const iHexLen )
{
new iBinaryLen = strlen( szBinary );
new szByte[ 5 ], iLen;
new iByteValue;
new iHexPos;
for( new iPos = iBinaryLen - 1; iPos >= 0 && iHexPos < iHexLen; )
{
iLen = 0;
while( iLen < 4 && iPos >= 0 )
{
szByte[ 4 - ( ++iLen ) ] = szBinary[ iPos-- ];
}
copy( szByte, iLen, szByte[ 4 - iLen ] );
iByteValue = BinaryStringToDecimal( szByte );
szHexResult[ iHexPos++ ] = __HEXCHARS[ iByteValue ];
}
ReverseArray( szHexResult, iHexPos );
szHexResult[ iHexPos ] = 0;
return iHexPos;
}
stock HexToBinary( const szHex[ ], szBinaryResult[ ], const iBinaryLen )
{
new iHexPos;
new cChar;
new iValue;
new iByteIndex;
new iBinaryPos;
while( ( cChar = szHex[ iHexPos ] ) && iBinaryPos < iBinaryLen )
{
switch( cChar )
{
case '0' .. '9':
{
iValue = cChar - '0';
}
case 'a' .. 'f':
{
iValue = 10 + cChar - 'a';
}
case 'A' .. 'F':
{
iValue = 10 + cChar - 'A';
}
default:
{
return -1;
}
}
for( iByteIndex = 0; iByteIndex < 4 && iBinaryPos < iBinaryLen; iByteIndex++ )
{
szBinaryResult[ iBinaryPos++ ] = ( iValue & ( 1 << iByteIndex ) ) ? '1' : '0';
}
iHexPos++;
}
szBinaryResult[ iBinaryPos ] = 0;
return iBinaryPos;
}
stock GetDigits( const iValue, iDigits[ ] = "", const iDigitSize = 0, const iBase = 10, bool:bKeepDigitOrder = false )
{
new iDigitCount;
new iTemp = iValue;
while( iTemp > 0 && iDigitCount < iDigitSize )
{
iDigits[ iDigitCount++ ] = iTemp % iBase;
iTemp /= iBase;
}
if( bKeepDigitOrder )
{
ReverseArray( iDigits, iDigitCount );
}
return iDigitCount;
}
stock ReverseArray( iArray[ ], const iSize )
{
new iMiddle = iSize / 2;
new iTemp;
for( new i = 0, iOpposite = iSize - 1; i < iMiddle; i++, iOpposite-- )
{
iTemp = iArray[ i ];
iArray[ i ] = iArray[ iOpposite ];
iArray[ iOpposite ] = iTemp;
}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang11274\\ f0\\ fs16 \n\\ par }
*/
КАК ДА ИЗПОЛЗВАМ
Добави в началото на .sma файла:
#include <number_convert>
1. Изтегли
Свали файла от бутона по-горе
2. Копирай
Постави в
scripting/include/3. Включи
Добави #include директивата
4. Компилирай
Използвай amxxpc или scripting/compile.exe