Всем привет.
Хочу поделиться с вами наработками, точнее двумя классами. Они были написаны мной несколько дней назад при изучении IPv4. Как-то само собой получилось, читая информацию по IPv4 я уже сидел и писал эти классы.
Изучение и практика по Битовым операциям, так появился класс TBinHelper.
Класс TBinHelper содержит методы:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <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; |
Далее, вдоволь наигравшись с битовыми операциями, было решено запилить CIDR Калькулятор. Для этого был создан класс TIPv4Helper.
Класс TIPv4Helper содержит методы:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <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; |
Постарался давать понятные названия для методов, но комментарии тоже оставил (все 😅).
Оба класса выложил на свой 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.
На этом всё, спасибо за уделённое внимание.