[ANY] Ip to int

Тема в разделе "Программирование / Скриптинг", создана пользователем R1KO, 29 сен 2016.

  1. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.005
    Симпатии:
    2.994
    Может кому нужно будет функции для преобразования строки с айпи в int (4 байта) и обратно.
    Можно было сделать на стандартных ф-ях см но мне захотелось сделать так.
    PHP:
    #pragma semicolon 1
    #include <sourcemod>

    #pragma newdecls required

    public void OnClientPostAdminCheck(int iClient)
    {
        
    char szIp[16];
        
    GetClientIP(iClientszIpsizeof(szIp));
        
    LogMessage("Original IP: %s"szIp);
        
    int iLongIP IP2L(szIp);
        
    LogMessage("Long IP: %i"iLongIP);
        
    L2IP(iLongIPszIpsizeof(szIp));
        
    LogMessage("Result IP: %s"szIp);
    }

    stock int IP2L(const char[] szIp)
    {
        
    char szParts[4][4];
        if(
    ExplodeStringByChar(szIp'.'szParts44) == 4)
        {
            return (((
    StringToInt(szParts[0])*256+StringToInt(szParts[1]))*256+StringToInt(szParts[2]))*256+StringToInt(szParts[3]));
        }

        return 
    0;
    }

    stock void L2IP(int iIpchar[] szBufferint iMaxLen)
    {
        
    FormatEx(szBufferiMaxLen"%d.%d.%d.%d", (iIp >> 24) & 0x000000FF, (iIp >> 16) & 0x000000FF, (iIp >>  8) & 0x000000FFiIp 0x000000FF);
    }

    stock int ExplodeStringByChar(const char[] szTextint iCharchar[][] szBuffersint iMaxStringsint iMaxStringLengthbool bCopyRemainder false)
    {
        
    int reloc_idxidxtotal;

        while ((
    idx FindCharEx(szText[reloc_idx], iChar)) != -1)
        {
            
    strcopy(szBuffers[total], idx+1szText[reloc_idx]);
            
    szBuffers[total][idx] = 0// Вроде можно без этого
            
    reloc_idx += idx+1;
            if (++
    total == iMaxStrings)
            {
                if (
    bCopyRemainder)
                {
                    
    strcopy(szBuffers[total-1], iMaxStringLengthszText[reloc_idx-idx]);
                }
                return 
    total;
            }
        }

        
    strcopy(szBuffers[total++], iMaxStringLengthszText[reloc_idx]);

        return 
    total;
    }

    stock int FindCharEx(const char[] szBufferchar iChar)
    {
        
    int len strlen(szBuffer), i;

        for (
    0len; ++i)
        {
            if (
    szBuffer[i] == iChar)
                return 
    i;
        }

        return -
    1;
    }
     
    komashchenko, CrazyHackGUT, AlmazON и 2 другим нравится это.