Java实现Encode和Decode

Java解决前端URL转码问题
博客指出前端传递的URL被转码,给出了应传和实际传的URL示例,重点在于探讨解决此问题的方法,主要围绕Java技术来处理前端URL转码情况。

一 概述

       前端传递过来的url被转码了;

        应该传的:https://-/eg/2021/06/02/9f014257-a1d0-4486-9d8d-7e5cd45e665e.jpeg?imageMogr2/auto-orient

        实际传的:https%3A%2F%2F-%2Feg%2F2021%2F05%2F28%2F28cf0d6f-11eb-4d98-ae0d-60b7f16037e5.jpeg%3FimageMogr2%2Fauto-orient

二 解决方法

//url转码
try {
    String thumbUrl = java.net.URLDecoder.decode(url, "UTF-8");
     } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
     }

 

### Base62 编码解码在 Java 中的实现 Base62 是一种常见的数据编码方式,类似于 Base64,但它使用 62 个字符(通常是 `0-9`、`A-Z` `a-z`)来表示数据。这种编码方式常用于需要将二进制数据转换为可打印文本格式的场景,例如生成短链接或唯一标识符。 #### Base62 编码原理 Base62 编码的核心思想是将任意字节流转换为一个由 62 个字符组成的字符串。具体步骤如下: 1. **分组**:将输入的字节按每 6 位进行分割,因为 $2^6 = 64$,而 Base62 使用 62 个字符,因此需要确保字符集与数值范围匹配。 2. **映射**:将每组 6 位的二进制值映射到 Base62 字符集中对应的字符。 3. **拼接**:将所有映射后的字符拼接成最终的编码结果。 #### Base62 解码原理 Base62 解码的过程与编码相反,主要包括以下步骤: 1. **拆分**:将编码后的字符串逐个字符拆分为单独的字符。 2. **反向映射**:将每个字符转换回其对应的 6 位二进制值。 3. **合并**:将所有的 6 位二进制值重新组合成原始的字节流。 #### Java 实现代码 以下是一个简单的 Java 实现,用于完成 Base62 的编码解码功能: ```java import java.util.HashMap; import java.util.Map; public class Base62 { private static final String BASE62_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static final int BASE62 = 62; private static final Map<Character, Integer> CHAR_TO_INDEX_MAP = new HashMap<>(); static { for (int i = 0; i < BASE62_CHARS.length(); i++) { CHAR_TO_INDEX_MAP.put(BASE62_CHARS.charAt(i), i); } } // 编码方法 public static String encode(byte[] data) { StringBuilder sb = new StringBuilder(); long value = byteArrayToLong(data); do { int index = (int) (value % BASE62); sb.append(BASE62_CHARS.charAt(index)); value /= BASE62; } while (value > 0); return sb.reverse().toString(); } // 解码方法 public static byte[] decode(String base62String) { long value = 0L; for (char c : base62String.toCharArray()) { Integer index = CHAR_TO_INDEX_MAP.get(c); if (index == null) { throw new IllegalArgumentException("Invalid Base62 character: " + c); } value = value * BASE62 + index; } return longToByteArray(value); } // 将字节数组转换为长整型 private static long byteArrayToLong(byte[] data) { long value = 0L; for (byte b : data) { value = (value << 8) | (b & 0xFF); } return value; } // 将长整型转换为字节数组 private static byte[] longToByteArray(long value) { byte[] data = new byte[8]; for (int i = 7; i >= 0 && value > 0; i--) { data[i] = (byte) (value & 0xFF); value >>= 8; } return data; } // 测试用例 public static void main(String[] args) { String originalData = "HelloWorld"; byte[] encodedBytes = originalData.getBytes(); String encodedString = encode(encodedBytes); System.out.println("Encoded: " + encodedString); byte[] decodedBytes = decode(encodedString); String decodedString = new String(decodedBytes).trim(); System.out.println("Decoded: " + decodedString); } } ``` #### 注意事项 - **字符集选择**:Base62 的字符集可以根据需求自定义,但通常采用 `0-9`、`A-Z` `a-z` 的组合。 - **长度限制**:由于此实现仅适用于较小的数据量,对于大文件或大数据量的处理可能需要优化。 - **兼容性问题**:不同平台或库之间的 Base62 实现可能存在差异,需确保编码解码逻辑一致。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值