字符串内存理解和js加密解密与java后端解密对应方法

本文介绍字符串在不同编码下所占内存及JavaScript与Java间的加密解密方法,包括escape、encodeURI和encodeURIComponent等函数的使用及Java后台对应的解密方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一、字符串内存理解

     1、容量大小计算 1byte=8bit  1k=1024byte 1m=1024k 1g=1024m 1t=1024g

    2、java字符串中使用getByte()获取字符串的字节(byte)数量,即存储空间大小。

    3、英文字母(a-z获取A-Z)一个字母占一个字节,即1024个字母=1k

    4、英文下的符号(~!@#¥%……&*())等等一个占一个字节,即1024个符号=1k

    5、中文汉字一个汉字占用的字节数和中文汉字的编码直接关联,常用编码字节数如下:

          GBK,GB2312,GB18030编码的汉字一个汉字占用2个字节,即512个汉字=1k

          UTF-8编码的汉字一个汉字占用3个字节,即341个汉字=1k

  UTF-16编码的汉字一个汉字占用4个字节,即256个汉字=1k

    6、中文字符占用字节和中文汉字相同。


第二、js加密解密与java后端解密对应方法

      1、测试代码

var ni="{name:\"wos\",age:12}";
var tmp=escape(ni);
console.log(tmp);
console.log(unescape(tmp));
var tmp2=encodeURI(ni);
console.log(tmp2);
console.log(decodeURI(tmp2));
var tmp3=encodeURIComponent(ni);
console.log(tmp3);
console.log(decodeURIComponent(tmp3));


一、encodeURI() 函数可把字符串作为 URI 进行编码。
语法
encodeURI(URIstring)
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
此方法的解码为decodeURI()
1)encodeURI和URLEncoder.encode的区别在于前者对下面五个符号不编码
! %21  ' %27   ( %28   ) %29   ~ %7E
2)前后台交互传输数据的过程中,如果含有!'()~,同样的内容会传输不同的编码结果
java 
URLDecoder.decode(value, "utf-8");  decodeURI(value): 将utf-8的value反转成字符串。


二、escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。
提示:可以使用 unescape() 对 escape() 编码的字符串进行解码。
注释:ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。


//Java 后台 js escape后的 unescape 解密方法
public static String unescape(String src) {
 StringBuffer tmp = new StringBuffer();
 tmp.ensureCapacity(src.length());
 int lastPos = 0, pos = 0;
 char ch;
 while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}
 
 //js java 对应的 escape编码方法
public static String escape(String src) {
        int i;
        char j;
        StringBuffer tmp = new StringBuffer();
        tmp.ensureCapacity(src.length() * 6);
        for (i = 0; i < src.length(); i++) {
            j = src.charAt(i);
            if (Character.isDigit(j) || Character.isLowerCase(j)
                    || Character.isUpperCase(j))
                tmp.append(j);
            else if (j < 256) {
                tmp.append("%");
                if (j < 16)
                    tmp.append("0");
                tmp.append(Integer.toString(j, 16));
            } else {
                tmp.append("%u");
                tmp.append(Integer.toString(j, 16));
            }
        }
        return tmp.toString();
    }


三、JavaScript encodeURIComponent() 函数
encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
encodeURIComponent(URIstring)
URIstring 必需。一个字符串,含有 URI 组件或其他要编码的文本。
URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
解密方法 decodeURIComponent


Java 
java.net.URLDecoder.encode("df","UTF-8");    encodeURIComponent
java.net.URLDecoder.decode(tmp, "utf-8")     decodeURIComponent


1)encodeURIComponent和URLEncoder.encode的区别在于前者对下面五个符号不编码
! %21  ' %27   ( %28   ) %29   ~ %7E
2)前后台交互传输数据的过程中,如果含有!'()~,同样的内容会传输不同的编码结果


encodeURIComponent编码后java后台的解码
解决方法一:


JavaScript:


window.self.location="searchbytext.action?searchtext="+encodeURIComponent(encodeURIComponent(seartext));


Java:


searchtext=java.NET.URLDecoder.decode(searchtext,"UTF-8");


为什么要两次编码的原因:后台java代码给searchtext赋值的时候,本身已经使用了一次解码,不过解码的结果依然不对。所以我们可以在页面上进行两次编码操作,这样后台自动的那次就可以抵消掉一次,然后在使用searchtext=java.Net.URLDecoder.decode(searchtext,"UTF-8");进行一次解码就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值