mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
Merge remote-tracking branch 'origin/v5-dev' into v5-dev
This commit is contained in:
commit
41d3f0d931
@ -12,6 +12,7 @@
|
|||||||
* 【core 】 MapBuilder增加put方法(pr#367@Gitee)
|
* 【core 】 MapBuilder增加put方法(pr#367@Gitee)
|
||||||
* 【core 】 StrUtil.insert支持负数index
|
* 【core 】 StrUtil.insert支持负数index
|
||||||
* 【core 】 Calculator类支持取模运算(issue#I40DUW@Gitee)
|
* 【core 】 Calculator类支持取模运算(issue#I40DUW@Gitee)
|
||||||
|
* 【core 】 增加Base64.isBase64方法(issue#1710@Github)
|
||||||
|
|
||||||
### 🐞Bug修复
|
### 🐞Bug修复
|
||||||
* 【core 】 修复FileUtil.normalize处理上级路径的问题(issue#I3YPEH@Gitee)
|
* 【core 】 修复FileUtil.normalize处理上级路径的问题(issue#I3YPEH@Gitee)
|
||||||
|
@ -314,4 +314,43 @@ public class Base64 {
|
|||||||
public static byte[] decode(byte[] in) {
|
public static byte[] decode(byte[] in) {
|
||||||
return Base64Decoder.decode(in);
|
return Base64Decoder.decode(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查是否为Base64
|
||||||
|
*
|
||||||
|
* @param base64 Base64的bytes
|
||||||
|
* @return 是否为Base64
|
||||||
|
* @since 5.7.5
|
||||||
|
*/
|
||||||
|
public static boolean isBase64(String base64){
|
||||||
|
return isBase64(StrUtil.utf8Bytes(base64));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查是否为Base64
|
||||||
|
*
|
||||||
|
* @param base64Bytes Base64的bytes
|
||||||
|
* @return 是否为Base64
|
||||||
|
* @since 5.7.5
|
||||||
|
*/
|
||||||
|
public static boolean isBase64(byte[] base64Bytes){
|
||||||
|
for (byte base64Byte : base64Bytes) {
|
||||||
|
if (false == (Base64Decoder.isBase64Code(base64Byte) || isWhiteSpace(base64Byte))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isWhiteSpace(byte byteToCheck) {
|
||||||
|
switch (byteToCheck) {
|
||||||
|
case ' ' :
|
||||||
|
case '\n' :
|
||||||
|
case '\r' :
|
||||||
|
case '\t' :
|
||||||
|
return true;
|
||||||
|
default :
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package cn.hutool.core.codec;
|
package cn.hutool.core.codec;
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
|
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import cn.hutool.core.util.CharsetUtil;
|
import cn.hutool.core.util.CharsetUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base64解码实现
|
* Base64解码实现
|
||||||
*
|
*
|
||||||
@ -130,6 +130,17 @@ public class Base64Decoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给定的字符是否为Base64字符
|
||||||
|
*
|
||||||
|
* @param octet 被检查的字符
|
||||||
|
* @return 是否为Base64字符
|
||||||
|
* @since 5.7.5
|
||||||
|
*/
|
||||||
|
public static boolean isBase64Code(byte octet) {
|
||||||
|
return octet == '=' || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1);
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------------------- Private start
|
// ----------------------------------------------------------------------------------------------- Private start
|
||||||
/**
|
/**
|
||||||
* 获取下一个有效的byte字符
|
* 获取下一个有效的byte字符
|
||||||
|
@ -1479,7 +1479,8 @@ public class FileUtil extends PathUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// issue#1703@Github
|
// issue#1703@Github
|
||||||
if(tops > 0){
|
if(tops > 0 && StrUtil.isEmpty(prefix)){
|
||||||
|
// 只有相对路径补充开头的..,绝对路径直接忽略之
|
||||||
while (tops-- > 0){
|
while (tops-- > 0){
|
||||||
//遍历完节点发现还有上级标注(即开头有一个或多个..),补充之
|
//遍历完节点发现还有上级标注(即开头有一个或多个..),补充之
|
||||||
// Normal path element found.
|
// Normal path element found.
|
||||||
|
@ -75,18 +75,6 @@ public class MapBuilder<K, V> implements Serializable {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 链式Map创建
|
|
||||||
*
|
|
||||||
* @param k Key类型
|
|
||||||
* @param supplier Value类型结果提供方
|
|
||||||
* @return 当前类
|
|
||||||
* @since 5.7.5
|
|
||||||
*/
|
|
||||||
public MapBuilder<K, V> put(K k, Supplier<V> supplier) {
|
|
||||||
return put(k, supplier.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 链式Map创建
|
* 链式Map创建
|
||||||
*
|
*
|
||||||
@ -114,7 +102,7 @@ public class MapBuilder<K, V> implements Serializable {
|
|||||||
*/
|
*/
|
||||||
public MapBuilder<K, V> put(boolean condition, K k, Supplier<V> supplier) {
|
public MapBuilder<K, V> put(boolean condition, K k, Supplier<V> supplier) {
|
||||||
if (condition) {
|
if (condition) {
|
||||||
put(k, supplier);
|
put(k, supplier.get());
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cn.hutool.core.codec;
|
package cn.hutool.core.codec;
|
||||||
|
|
||||||
import cn.hutool.core.util.CharsetUtil;
|
import cn.hutool.core.util.CharsetUtil;
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -13,6 +14,11 @@ import org.junit.Test;
|
|||||||
*/
|
*/
|
||||||
public class Base64Test {
|
public class Base64Test {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isBase64Test(){
|
||||||
|
Assert.assertTrue(Base64.isBase64(Base64.encode(RandomUtil.randomString(100))));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void encodeAndDecodeTest() {
|
public void encodeAndDecodeTest() {
|
||||||
String a = "伦家是一个非常长的字符串66";
|
String a = "伦家是一个非常长的字符串66";
|
||||||
|
@ -147,7 +147,7 @@ public class FileUtilTest {
|
|||||||
Assert.assertEquals("/bar", FileUtil.normalize("/foo/../bar"));
|
Assert.assertEquals("/bar", FileUtil.normalize("/foo/../bar"));
|
||||||
Assert.assertEquals("/bar/", FileUtil.normalize("/foo/../bar/"));
|
Assert.assertEquals("/bar/", FileUtil.normalize("/foo/../bar/"));
|
||||||
Assert.assertEquals("/baz", FileUtil.normalize("/foo/../bar/../baz"));
|
Assert.assertEquals("/baz", FileUtil.normalize("/foo/../bar/../baz"));
|
||||||
Assert.assertEquals("/../", FileUtil.normalize("/../"));
|
Assert.assertEquals("/", FileUtil.normalize("/../"));
|
||||||
Assert.assertEquals("foo", FileUtil.normalize("foo/bar/.."));
|
Assert.assertEquals("foo", FileUtil.normalize("foo/bar/.."));
|
||||||
Assert.assertEquals("../bar", FileUtil.normalize("foo/../../bar"));
|
Assert.assertEquals("../bar", FileUtil.normalize("foo/../../bar"));
|
||||||
Assert.assertEquals("bar", FileUtil.normalize("foo/../bar"));
|
Assert.assertEquals("bar", FileUtil.normalize("foo/../bar"));
|
||||||
@ -155,7 +155,7 @@ public class FileUtilTest {
|
|||||||
Assert.assertEquals("/bar", FileUtil.normalize("//server/../bar"));
|
Assert.assertEquals("/bar", FileUtil.normalize("//server/../bar"));
|
||||||
Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\foo\\..\\bar"));
|
Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\foo\\..\\bar"));
|
||||||
//
|
//
|
||||||
Assert.assertEquals("C:/../bar", FileUtil.normalize("C:\\..\\bar"));
|
Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\..\\bar"));
|
||||||
Assert.assertEquals("../../bar", FileUtil.normalize("../../bar"));
|
Assert.assertEquals("../../bar", FileUtil.normalize("../../bar"));
|
||||||
Assert.assertEquals("C:/bar", FileUtil.normalize("/C:/bar"));
|
Assert.assertEquals("C:/bar", FileUtil.normalize("/C:/bar"));
|
||||||
Assert.assertEquals("C:", FileUtil.normalize("C:"));
|
Assert.assertEquals("C:", FileUtil.normalize("C:"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user