加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

跨平台传输中使用base64来保证非ascii码字符串的完整性

发布时间:2020-12-14 06:19:22 所属栏目:Java 来源:网络整理
导读:首先,我们来看一个例子: [] b= []{2,9,43 = String(b,"utf-8" [] b1=ss.getbytes(); 这种情况下,b和b1字节数组是相同的。 那下面这种情况呢? [] b= []{-2,-9,"utf-8" [] b1=ss.getbytes(); 打印出来的ss是一堆我们看不懂的东西!而且我们发现b和b1字节数

首先,我们来看一个例子:

[] b= []{2,9,43= String(b,"utf-8"[] b1=ss.getbytes();

这种情况下,b和b1字节数组是相同的。

那下面这种情况呢?

[] b= []{-2,-9,"utf-8"[] b1=ss.getbytes();

打印出来的ss是一堆我们看不懂的东西!而且我们发现b和b1字节数组长度都不同啦?为什么?

我们知道ascii编码的范围为0~127,那么-2,-9该如何编码呢??

b1和b的字节表示在传递过程中,数据失真了,那如何解决失真问题呢?

我们可以使用base64对-128~127的值进行改造(具体请自行google之)。

通过使base64编码解码则可以防止传输过程中出错。base64可使用commons-codec的,如下所示:

Method Summary

Methods
static byte[](byte[]?base64Data)
static byte[](?base64String)
static?(byte[]?pArray)
static byte[](byte[]?binaryData)
static byte[](byte[]?binaryData,boolean?isChunked)
static byte[]
static byte[](byte[]?binaryData,boolean?urlSafe,int?maxResultSize)
static byte[](byte[]?binaryData)
static?(byte[]?binaryData)
static byte[](byte[]?binaryData)
static?(byte[]?binaryData)
static byte[](?bigInt)
static boolean(byte[]?arrayOctet)
Deprecated.?
1.5 Use?isBase64(byte[]),will be removed in 2.0.
static boolean(byte?octet)
octet?is in the base 64 alphabet.
static boolean(byte[]?arrayOctet)
static boolean(?base64)
protected boolean(byte?octet)
octet?is in the Base64 alphabet.
boolean()
注意,当url传输过程中,为了保证不传输错误(例如缺少“+”等),请尽量使用urlSafe方法。

[] b= []{-2,43[] s=[] b1=Base64.decode(s);

我们看一下编码后的s是什么样子的?

47,118,99,114

编码后全部变为0~127的ascii编码,解码后b1的值为:

-2,43

b和b1相同,没有数据失真。

另外,也可以是使用bouncy castle支持。具体可以google之。

一些小细节:

1. 跨平台传输时可能传输的是十六进制字符串,要转换为byte数组再进行编码,转换方法为:从高位开始,两个十六进制字符为一组转为byte。实例如下:

String hex="1a2bcc";

先拆分,把“1a”,“2b” “cc”分别解析为byte数组 26,43,208?

2. 跨平台要考虑编码格式,如utf-8 或者gbk 或者iso-8895-1等。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!