HEX编码、Base64编码

摘要

本文将讲述HEXBase64,编码的规则。

HEX编码

hex编码也称之为Base16 编码

就是把一个字节,用十六进制来表示, 表示的结果得是字符形式的。 说过程大家就会更加容易理解

比如说字符的 ‘a’,在计算机底层存储的是 0110 0001 ,对应的16进制就是61 ,它对应的字符 是'61'

也就是说 ‘a’ 经过HEX编码转化成了 '61' ,从计算存储二进制的角度是 从0110 0001经过HEX编码成了 0011011000110001,占用的存储扩大了一倍。

其他任意二进制数据(字节为单位)都可以转化。

代码演示:

byte[] src = "a".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Hex.encode(src);

System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);

输出结果为61

字符串'a'编码后的字符结果:'61'
原长度:1,编码后的长度:2, 编码后是原来的2.00

Base64编码

Base64的算法规则

  • 把数据按照字节分为三个字节一组,也就是24bit,如果最后存在不够三个字节为一组,也就是不够24bit的话,就使用0补位

    • 由于 编码的时候以6bit为一个编码的单位,所以缺一个字节的话就是24-8=16bit,也就是补2bit的0,那么就得补成18bit,构成整数编码单位。
    • 缺两个字节的话就是24-16=8bit,那么就得补成12bit,也就是补4bit的0,构成整数编码单位。
  • 每一组按照 以6bit为单位按照下面表格进行编码。如果最后一组只有三个编码单位的长度,那么就在编码的结果最后加上=,。如果最后一组只有两个编码单位的长度,那么就在编码的结果最后加上==

    IndexBinaryCharIndexBinaryCharIndexBinaryCharIndexBinaryChar
    0000000A16010000Q32100000g48110000w
    1000001B17010001R33100001h49110001x
    2000010C18010010S34100010i50110010y
    3000011D19010011T35100011j51110011z
    4000100E20010100U36100100k521101000
    5000101F21010101V37100101l531101011
    6000110G22010110W38100110m541101102
    7000111H23010111X39100111n551101113
    8001000I24011000Y40101000o561110004
    9001001J25011001Z41101001p571110015
    10001010K26011010a42101010q581110106
    11001011L27011011b43101011r591110117
    12001100M28011100c44101100s601111008
    13001101N29011101d45101101t611111019
    14001110O30011110e46101110u62111110+
    15001111P31011111f47101111v63111111/
    Padding=

举例说明

  • 最后一组三个字节,不用补位

'abc'字符串 底层的二进制为 011000010110001001100011,这是24个bit为一组,以6bit分为四部分为 011000 010110 001001 100011 编码成对应上表的字符 ’ YWJj'

byte[] src = "abc".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Base64.encode(src);

System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);
字符串'abc'编码后的字符结果:'YWJj'
原长度:3,编码后的长度:4, 编码后是原来的1.33
  • 最后一组只有两个字节,补2bit 0

    'ab'字符串 底层的二进制为 0110000101100010,补位成 011000010110001000,以6bit分为三部分为 011000 010110 001000 编码成对应上表的字符 ’ YWI' ,因为比一般的少一个编码单位,所以在后面加上一个=字符,最终的结果就是 ’ YWI='

byte[] src = "ab".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Base64.encode(src);

System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);
字符串'ab'编码后的字符结果:'YWI='
原长度:2,编码后的长度:4, 编码后是原来的2.00
  • 最后一组只有一个字节 补4bit0

    'a'字符串 底层的二进制为 01100001,补位成 011000010000这是24个bit为一组,以6bit分为四部分为 011000 010000 编码成对应上表的字符 ’ YQ' ,因为比一般的少两个编码单位,所以后面加上两个=字符,最终的结果就是 ’ YQ=='

byte[] src = "a".getBytes(StandardCharsets.UTF_8);
byte[] encoded = Base64.encode(src);


System.out.printf("字符串'%s'编码后的字符结果:'%s'%n",new String(src,StandardCharsets.UTF_8),new String(encoded,StandardCharsets.UTF_8));
System.out.printf("原长度:%d,编码后的长度:%d, 编码后是原来的%.2f%n",src.length,encoded.length,(double)(encoded.length)/src.length);
字符串'a'编码后的字符结果:'YQ=='
原长度:1,编码后的长度:4, 编码后是原来的4.00

由于在编码的过程中只有最后一组才有可能存在补位情况,所以我们可以认为 使用base64编码后数据的体积是原来的1.33

总结

​ HEX编码的特点是:解码编码速度快但是体积变大了一倍;Base64编码的特点: 体积小,但是由于算法相对复杂所以解码编码速度比较慢。

​ 由于两种编码规则可以是任何二进制的数据编码成字符集可以翻译二进制数据,这样的话我们就轻而易举的把二进制数据打印显示出来。便于我们查看二进制数据。有些网络协议传输只支持文本流的二进制数据传输,所以这时候就可以使用这两种编码。

爬虫Python学习是指学习如何使用Python编程语言来进行网络爬取和数据提取的过程。Python是一种简单易学且功能强大的编程语言,因此被广泛用于爬虫开发。爬虫是指通过编写程序自动抓取网页上的信息,可以用于数据采集、数据分析、网站监测等多个领域。 对于想要学习爬虫的新手来说,Python是一个很好的入门语言。Python的语法简洁易懂,而且有丰富的第三方库和工具,如BeautifulSoup、Scrapy等,可以帮助开发者更轻松地进行网页解析和数据提取。此外,Python还有很多优秀的教程和学习资源可供选择,可以帮助新手快速入门并掌握爬虫技能。 如果你对Python编程有一定的基础,那么学习爬虫并不难。你可以通过观看教学视频、阅读教程、参与在线课程等方式来学习。网络上有很多免费和付费的学习资源可供选择,你可以根据自己的需求和学习风格选择适合自己的学习材料。 总之,学习爬虫Python需要一定的编程基础,但并不难。通过选择合适的学习资源和不断实践,你可以逐步掌握爬虫的技能,并在实际项目中应用它们。 #### 引用[.reference_title] - *1* *3* [如何自学Python爬虫? 零基础入门教程](https://blog.csdn.net/zihong523/article/details/122001612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [新手小白必看 Python爬虫学习路线全面指导](https://blog.csdn.net/weixin_67991858/article/details/128370135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值