一个字节为什么用两个十六进制表示
1、一个字节 = 8位(8个二进制位) 1Byte = 8bit;
2、一个十六进制 = 4个二进制位
3、一个字节 = 2个十六进制
UUID不是128位长的吗,怎么生成的都是36个字符的字符串?
- 解释一
128位是二进制, 每四个二进制转一个16进制数。 128/4=32
所以,就是32个16进制数的字符了。
128位 = 128/8 = 16字节 - 解释二
每个字节可以用2个可见字符(ASCII)以十六进制(base16编码)表示, 所以表示16个字节需要32个字符.
然后4个连字符(-)是UUID的可视化呈现标准要求的.
hex(base16)、base32、base64三种编码方式区别
hex编码不区分大小写,base32与base64编码区分大小写
三种都是稳定的把二进制数组变成可见字符的编码方式
-
hex(等同于base16)
1.使用16个可见字符来表示一个二进制数组
2.而Base16就是16进制,他的范围是数字(0-9),字母(ABCDEF); -
base32
1.使用32个可见字符来表示一个二进制数组
2.大写字母(A-Z)和数字234567; -
base64
1.使用64个可见字符来表示一个二进制数组
2.大写字母(A-Z),小写字母(a-z),数字(0-9)以及+/;
字节数组Base64和16进制编码对比
国密算法有多种,常用的有SM2、SM3、SM4,分别对应非对称加密(RSA等)、消息摘要(MD5、SHA等)、对称加密(AES、DES、3DES等)。
底层国密类库,都是采用byte数组进行加密换算,而在应用层,通常需要将byte数组进行转换,以便将数据进行传输和处理
将byte数组进行不同编码格式转换,会存在多种问题。例如:
- 将byte数组转成ASCII编码,必须确保byte数组的值在ASCII的可视字符范围,否则会出现乱码,因为ASCII的取值范围比byte小(0~255)。
- 将byte数组转成UTF8等其他类型编码,也有可能导致转换后的String长度与byte数组长度不同,因为不同的编码格式,占用的byte个数不同。
- 可以将byte数组转成Base64编码。
- 可以将byte数组转成Hex的16进制字符串,一个byte占8位,正好对应两个16进制的字符。
后面两种方式在密码学中比较常用,能很好的解决byte数组转换过程中的乱码问题。然而后两种方式也有需要注意的地方,例如:
- Base64编码后会在结果中出现+号,如果直接拼接在url后面进行get请求,接收方在解码的时候,很有可能会被自动转换成空格,导致错误结果。+号变空格的解决方案有两种,第一种采用post方式传输,因为body内容通常都会进行application/x-www-form-urlencoded;第二种主动调用urlencode方法对字符串进行url编码,再使用get请求。
- 将byte数组转成16进制字符串的时候,得到的结果会比Base64编码长,在传输过程中数据量更大。因为传输过程通常都是将string转成utf8传输,不同长度的string,对应的utf8字节数组长度当然不同。
总结
- 同样长度的byte数组转换,Base64比HexString更短,传输过程更有优势。
- HexString不需要处理特殊字符,更加方便。
只要处理好了Base64过程中+号可能变空格的问题,使用Base64进行通信,比采用16进制的String更优。