活动介绍
file-type

Java IP地址转换工具类 IpUtil

TXT文件

下载需积分: 10 | 4KB | 更新于2024-09-15 | 154 浏览量 | 4 评论 | 1 下载量 举报 收藏
download 立即下载
"iputil工具代码提供了一个Java类,用于将IP地址字符串转换为十进制整数形式。" 在编程中,有时我们需要处理IP地址,例如在网络通信、数据分析或服务器配置等场景。`IpUtil`类就是这样一个工具,它专注于IP地址与整数之间的转换。IP地址通常以点分十进制(dotted-decimal notation)的形式表示,例如"192.168.0.1",而内部存储或计算时,可能需要将其转换为整数形式,以便进行比较或操作。 `IpUtil`类定义了一系列私有常量,这些常量与IP地址的结构相关,例如`TWO`到`TWO_FIVE_FIVE`代表了IP地址每个部分的最大值,以及`SIX_F`到`TWO_F`代表了不同部分对应的二进制位数。这些常量的使用有助于在代码中简化计算。 类中的构造函数是私有的,意味着外部不能直接创建`IpUtil`的实例,这是一种常见的设计模式,使得类只能通过静态方法来访问,避免了不必要的实例化。 核心方法`strToLong(String strIp)`接收一个IP地址字符串,然后将其转换为十进制整数。首先,它检查输入是否为空,如果为空则返回0。接着,它使用`indexOf(".")`找到字符串中点的位置,以此来划分IP地址的四个部分。然后,对于每个部分,它使用`Long.parseLong()`将字符串转换为整数,并存储在一个`long`类型的数组中。 这种方法的关键在于理解IP地址的结构,每个部分是一个0-255的十进制数字,总共四个部分。通过逐个解析并转换,最后可以将这四个数字组合成一个长整数。这个过程涉及到了字符串操作、数字解析和整数位运算,是网络编程中常见的一种技巧。 这个类的其他方法未在提供的内容中展示,但我们可以推测它可能还包含将十进制整数转换回IP地址字符串的方法,以及其他辅助方法,如校验IP地址的有效性等。 `IpUtil`工具类提供了IP地址字符串与整数之间的转换功能,对于处理IP地址的Java应用程序非常有用。这种转换在处理网络数据、进行IP地址比较或进行路由计算时是必要的。

相关推荐

filetype

不是,是针对这段代码进行修改:package damddos.flink_udfs.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.*; public class IpRegionResolverV2 { private static List<CidrEntry> ipv4Entries = new ArrayList<>(); private static List<CidrEntry> ipv6Entries = new ArrayList<>(); private static List<CidrEntry> ipv4EntriesEnd = new ArrayList<>(); private static List<CidrEntry> ipv6EntriesEnd = new ArrayList<>(); static { try { loadFromCsv("/IP_ORG_20250528.csv"); } catch (IOException e) { throw new RuntimeException(e); } } // 加载CSV文件并构建CIDR索引 public static void loadFromCsv(String filePath) throws IOException { try (BufferedReader br = new BufferedReader(new InputStreamReader(IpRegionResolverV2.class.getResourceAsStream(filePath), StandardCharsets.UTF_8))) { String line; int lineNumber = 0; while ((line = br.readLine()) != null) { lineNumber++; line = line.trim(); if (line.isEmpty() || line.startsWith("#")) continue; try { String[] parts = line.split(",", 2); if (parts.length != 2) { throw new IllegalArgumentException("格式错误,第" + lineNumber + "行: " + line); } String cidrStr = parts[0].trim(); String region = parts[1].trim(); if (cidrStr.contains("/")) { if (cidrStr.contains(":")) { ipv6Entries.add(CidrConverter.getIpsV6ByCidr(cidrStr, region)); } else { ipv4Entries.add(CidrConverter.getIpsV4ByCidr(cidrStr, region)); } }else { if (IPUtil.isValidIPV4Addr(cidrStr)) { ipv4Entries.add(new CidrEntry(IPUtil.long2String0(IPUtil.ipV4ToLong(cidrStr),10),IPUtil.long2String0(IPUtil.ipV4ToLong(cidrStr),10),region, true)); } else if (IPUtil.isValidIPv6Addr(cidrStr)) { ipv6Entries.add(CidrConverter.getIpsV6ByCidr(cidrStr+"/128", region)); } else { System.err.println("处理失败,第" + lineNumber + "行: " + line); } } } catch (Exception e) { System.err.println("处理失败,第" + lineNumber + "行: " + line); e.printStackTrace(); } } } sortEntries(); } // 排序CIDR条目 private static void sortEntries() { ipv4Entries= getMappingInfo(ipv4Entries); ipv4EntriesEnd = new ArrayList<>(ipv4Entries); ipv4EntriesEnd.sort(Comparator.comparing(CidrEntry::getEnd)); ipv6Entries= getMappingInfo(ipv6Entries); ipv6EntriesEnd = new ArrayList<>(ipv6Entries); ipv6EntriesEnd.sort(Comparator.comparing(CidrEntry::getEnd)); } public static List<CidrEntry> getMappingInfo(List<CidrEntry> entries) { Map<String,List<CidrEntry>> regionMap = new HashMap<>(); for (CidrEntry entry : entries) { if (regionMap.containsKey(entry.getRegion())) { int i = 0; List<CidrEntry> regionEntryList = regionMap.get(entry.getRegion()); CidrEntry oldEntry = regionEntryList.get(i); String startIp = oldEntry.getStart(); String endIp = oldEntry.getEnd(); boolean change = false; for (int j=i+1; j < regionEntryList.size(); j++) { CidrEntry entry2 = regionEntryList.get(j); if ((oldEntry.getStart().compareTo(entry2.getStart()) > 0 && oldEntry.getStart().compareTo(entry2.getEnd()) <= 0)) { change = true; startIp = entry2.getStart(); } if ((oldEntry.getEnd().compareTo(entry2.getEnd()) < 0 && oldEntry.getEnd().compareTo(entry2.getStart()) >= 0)) { change = true; endIp = entry2.getEnd(); } } if (change) { oldEntry.setStart(startIp); oldEntry.setEnd(endIp); } if (!change){ regionEntryList.add(entry); } regionEntryList.sort(Comparator.comparing(CidrEntry::getStart)); regionMap.put(entry.getRegion(),regionEntryList); } else { List <CidrEntry> regionEntryList = new ArrayList<>(); regionEntryList.add(entry); regionMap.put(entry.getRegion(),regionEntryList); } } List<CidrEntry> result = new ArrayList<>(); for (Map.Entry<String,List<CidrEntry>> entry : regionMap.entrySet()) { result.addAll(entry.getValue()); } result.sort(Comparator.comparing(CidrEntry::getStart)); return result; } // 查询IP所属区域 public static String findRegion(String ipStr) { try { if (IPUtil.isValidIPV4Addr(ipStr)){ ipStr = IPUtil.long2String0(IPUtil.ipV4ToLong(ipStr),10); return binarySearch(ipStr, ipv4Entries).isEmpty() ? binarySearch(ipStr, ipv4EntriesEnd) : binarySearch(ipStr, ipv4Entries); }else{ ipStr = IPUtil.parseFullIPv6(ipStr); return binarySearch(ipStr, ipv6Entries).isEmpty() ? binarySearch(ipStr, ipv6EntriesEnd) : binarySearch(ipStr, ipv6Entries); } } catch (Exception e) { return "INVALID_IP"; } } // IPv4二分查找 private static String binarySearch(String target, List<CidrEntry> entries) { int low = 0, high = entries.size() - 1; while (low <= high) { int mid = (low + high) >>> 1; CidrEntry entry = entries.get(mid); if (target.compareTo(entry.getStart()) < 0) { high = mid - 1; } else if (target.compareTo(entry.getEnd()) > 0) { low = mid + 1; } else { if (target.compareTo(entry.getStart()) >= 0 && target.compareTo(entry.getEnd()) <= 0){ return entry.getRegion(); } } } return ""; } // 测试用例 public static void main(String[] args) throws IOException { String ipAddress = "132.122.249.161"; String ipAddress2 = "132.122.249.185"; String ipAddress3 = "132.122.54.115"; String ipAddress4 = "132.122.53.104"; String ipAddress5 = "127.0.0.3"; long s = System.currentTimeMillis(); System.out.println(System.currentTimeMillis() - s); System.out.println(IpRegionResolverV2.findRegion(ipAddress)); System.out.println(IpRegionResolverV2.findRegion(ipAddress2)); System.out.println(IpRegionResolverV2.findRegion(ipAddress3)); System.out.println(IpRegionResolverV2.findRegion(ipAddress4)); } }

filetype

@Log(type = LogTypeEnum.UPDATE, name = "修改发票明细", memo = "修改发票明细") @Around("cutService()") public Object recordSysLog(ProceedingJoinPoint point) throws Throwable { //先执行业务 if (point == null) { return null; } Object result = point.proceed(); try { handle(point); } catch (Exception e) { log.error("日志记录出错!", e); } return result; } private void handle(ProceedingJoinPoint point) throws Exception { //获取拦截的方法名 Signature sig = point.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("该注解只能用于方法"); } msig = (MethodSignature) sig; Object target = point.getTarget(); Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes()); String methodName = currentMethod.getName(); //如果获取不到用户名,则记录为system String userName = UserUtil.getSessionUserName(); //获取操作类型,名称,备注 Log annotation = currentMethod.getAnnotation(Log.class); LogTypeEnum type = annotation.type(); String name = annotation.name(); String memo = annotation.memo(); //获取request作用域 ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = attr.getRequest(); //得到UserAgent对象 UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); //获得浏览器信息 Browser browser = userAgent.getBrowser(); //获得IP地址 String ip = IpUtil.getIpAddr(request); //日志实体赋值 SysLogDO sysLog = new SysLogDO(); sysLog.setType(type.value) .setName(name) .setUsername(userName) .setIp(ip) .setBroswer(browser.getName()) .setMemo(memo) .setVersions(0) .setOperatorTime(DateUtil.now()) .setCreateTime(DateUtil.now()) .setCreateName(userName); log.info("【{}({})】【{}】({})", sysLog.getUsername(), sysLog.getIp(), sysLog.getName(), sysLog.getType()); RequestContextHolder.setRequestAttributes(attr, true); //多线程异步执行 ThreadPoolManager.xfbd().execute(() -> { //新增日志 sysLogService.addLog(sysLog); }); }有没有办法新增一个操作对象,参数来源于方法中的参数

资源评论
用户头像
郑瑜伊
2025.05.18
代码结构清晰,iputil工具适合各类网络项目。
用户头像
爱设计的唐老鸭
2025.05.12
iputil工具的代码实现简洁高效,适合网络管理。
用户头像
顾露
2025.04.24
针对网络操作,iputil工具提供了强大的代码支持。
用户头像
首席程序IT
2025.04.16
iputil工具代码的实用性和灵活性值得肯定。
xhfcanyesw
  • 粉丝: 1
上传资源 快速赚钱