Страницы

суббота, 2 ноября 2019 г.

Хелперы для работы c IPv4 и не только...



Всем привет.
Хочу поделиться с вами наработками, точнее двумя классами. Они были написаны мной несколько дней назад при изучении IPv4. Как-то само собой получилось, читая информацию по IPv4 я уже сидел и писал эти классы.

















Изучение и практика по Битовым операциям, так появился класс TBinHelper.

Класс TBinHelper содержит методы:
/// <summary> Количество установленных бит </summary>
class function BitCount(const AValue: Int64; AIsByte: Boolean): Integer;
/// <summary> 0001010000000101 = 5125 </summary>
class function BinToDec(const AValue: string): Int64;
/// <summary> 5125 = 0001010000000101 </summary>
class function DecToBinStr(const AValue: Int64; ABits: Integer): string; overload;
/// <summary> 0..255 = 00000000 .. 11111111 </summary>
class function DecToBinStr(const AValue: Byte): string; overload;
view raw gistfile1.txt hosted with ❤ by GitHub

Далее, вдоволь наигравшись с битовыми операциями, было решено запилить CIDR Калькулятор. Для этого был создан класс TIPv4Helper.

Класс TIPv4Helper содержит методы:
/// <summary> 3232235777 -> 192.168.1.1 </summary>
class function DecToIpv4(const AValue: Cardinal): string;
/// <summary> 192.168.1.1 -> 3232235777 </summary>
class function Ipv4ToDec(const AValue: string): Cardinal;
/// <summary> Получем список всех возможных масок подсети </summary>
class function GetPossibleSubnetMasks(): TArray<string>;
/// <summary> 255.255.252.0 -> 0.0.3.255 </summary>
class function InverseSubnetMask(const AValue: string): string;
/// <summary> 192.168.1.2 -> 11000000.10101000.00000001.00000010 </summary>
class function IPv4ToBinStr(const AValue: string; AddSeparator: Boolean = True): string;
/// <summary> Получение Адреса сети исходя из Ip-адреса и маски подсети </summary>
class function GetNetworkAddress(const IPValue, SubnetMaskValue: string): string;
/// <summary> Получение Широковещательного адреса исходя из Ip-адреса и маски подсети </summary>
class function GetBroadcastAddress(const IPValue, SubnetMaskValue: string): string;
/// <summary> Получение Адреса для первого хоста исходя из Ip-адреса и маски подсети </summary>
class function GetIPAddressOfFirstHost(const IPValue, SubnetMaskValue: string): string;
/// <summary> Получение Адреса для последнего хоста исходя из Ip-адреса и маски подсети </summary>
class function GetIPAddressOfLastHost(const IPValue, SubnetMaskValue: string): string;
/// <summary> Получение Количества адресов в подсети исходя из маски подсети </summary>
class function GetNumberAvailableIPAddresses(const SubnetMaskValue: string): Int64;
view raw gistfile1.txt hosted with ❤ by GitHub

Постарался давать понятные названия для методов, но комментарии тоже оставил (все 😅).

Оба класса выложил на свой Github:
https://github.com/AndrewEfimov/Utils/blob/master/uBinHelper.pas
https://github.com/AndrewEfimov/Utils/blob/master/uIPv4Helper.pas

Потестить классы можно в моём маленьком приложении «CIDR Калькулятор»: Скачать с Google Drive

Классы написаны в Delphi 10.3.1, протестированы на Android, Windows 10 x64.
Надеюсь кому-то пригодятся.



Кстати, недавно (21.10.2019) обновил обёртку Androidapi.JNI.net.wifi.pas для работы с Wi-Fi (package android.net.wifi). Теперь она включает поддержку API 29 и все изменения в API на 21.10.2019.



На этом всё, спасибо за уделённое внимание.