68 lines
1.8 KiB
Swift
68 lines
1.8 KiB
Swift
//
|
|
// Util.swift
|
|
// Tun
|
|
//
|
|
// Created by 安礼成 on 2024/1/19.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
struct SDLUtil {
|
|
|
|
public static func int32ToIp(_ num: UInt32) -> String {
|
|
let ip0 = (UInt8) (num >> 24 & 0xFF)
|
|
let ip1 = (UInt8) (num >> 16 & 0xFF)
|
|
let ip2 = (UInt8) (num >> 8 & 0xFF)
|
|
let ip3 = (UInt8) (num & 0xFF)
|
|
|
|
return "\(ip0).\(ip1).\(ip2).\(ip3)"
|
|
}
|
|
|
|
public static func netMaskIp(maskLen: UInt8) -> String {
|
|
let len0 = 32 - maskLen
|
|
let num: UInt32 = (0xFFFFFFFF >> len0) << len0
|
|
|
|
let ip0 = (UInt8) (num >> 24 & 0xFF)
|
|
let ip1 = (UInt8) (num >> 16 & 0xFF)
|
|
let ip2 = (UInt8) (num >> 8 & 0xFF)
|
|
let ip3 = (UInt8) (num & 0xFF)
|
|
|
|
return "\(ip0).\(ip1).\(ip2).\(ip3)"
|
|
}
|
|
|
|
public static func ipv4StrToInt32(_ ip: String) -> UInt32? {
|
|
let parts = ip.split(separator: ".")
|
|
guard parts.count == 4 else {
|
|
return nil
|
|
}
|
|
|
|
var result: UInt32 = 0
|
|
for part in parts {
|
|
guard let byte = UInt8(part) else { return nil }
|
|
result = (result << 8) | UInt32(byte)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// 判断ip地址是否在同一个网络
|
|
public static func inSameNetwork(ip: UInt32, compareIp: UInt32, maskLen: UInt8) -> Bool {
|
|
if ip == compareIp {
|
|
return true
|
|
}
|
|
|
|
let len0 = 32 - maskLen
|
|
// 掩码值
|
|
let mask: UInt32 = (0xFFFFFFFF >> len0) << len0
|
|
|
|
return ip & mask == compareIp & mask
|
|
}
|
|
|
|
public static func formatMacAddress(mac: Data) -> String {
|
|
let bytes = [UInt8](mac)
|
|
|
|
return bytes.map { String(format: "%02X", $0) }.joined(separator: ":").lowercased()
|
|
}
|
|
|
|
}
|