BASE64编码原理与Golang代码调用

一.概念简介

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据

二.代码调用

在Golang中提供了代码库可以供我们直接调用,用于实现Base64的编码与解码,其提供了对两种格式的数据进行编码(与解码)

const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
const encodeURL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"

来自golang源码base64.go

1.标准数据(encodeStd)
    msg := "Mac"
    //编码
    base64EncodedString := base64.StdEncoding.EncodeToString([]byte(msg))
    fmt.Println("Base64编码后:", base64EncodedString)
    //解码
    base64DecodedByte, err := base64.StdEncoding.DecodeString(base64EncodedString)
    if err != nil {
        log.Panic(err)
    }
    fmt.Println("Base64解码后的字节数组:", base64DecodedByte)
    fmt.Println("Base64解码后:", string(base64DecodedByte))

返回打印结果

Base64编码后: TWFj
Base64解码后的字节数组: [77 97 99]
Base64解码后: Mac
2.URL数据(encodeURL)
msgUrl :="http://www.google.com"
    base64UrlEncodedString :=base64.URLEncoding.EncodeToString([]byte(msgUrl))
    fmt.Println("Base64编码后:", base64UrlEncodedString)
    base64UrlDecodedByte,err := base64.URLEncoding.DecodeString(base64UrlEncodedString)
    if err !=nil {
        log.Panic(err)
    }
    fmt.Println("Base64解码后的字节数组:", base64UrlDecodedByte)
    fmt.Println("Base64解码后:", string(base64UrlDecodedByte))

返回打印结果

Base64编码后: aHR0cDovL3d3dy5nb29nbGUuY29t
Base64解码后的字节数组: [104 116 116 112 58 47 47 119 119 119 46 103 111 111 103 108 101 46 99 111 109]
Base64解码后: http://www.google.com

三.编码原理

1.将每个字符转成ASCII编码(10进制)
fmt.Println([]byte(msg)) //[77 97 99]
2.将10进制编码转成2进制编码
fmt.Printf("%b",[]byte(msg))
//[1001101 1100001 1100011] 

补齐8位为:

[01001101 01100001 01100011] 
3.将2进制编码按照6位一组进行平分
010011 010110 000101 100011
4.转成10进制数

010011 ==> 1x2^0 + 1x2^1 + 0 + 0 + 1x2^4 = 19

010110 ==> 0 + 1x2^1 + 1x2^2 + 0 + 1x2^4 = 22

000101 ==> 1x2^0 + 0 + 1 x 2^2 + 0 + 0 + 0 = 5

100011 ==> 1x2^0 + 1x2^1 + 0 + 0 + 0 + 1x2^5 = 35

5.将十进制数作为索引,从Base64编码表中查找字符

19 对应 T
22 对应 W
5  对应 F
35 对应 j (注意是小写)

注意

  • 若文本为3个字符,则刚好编码为4个字符长度(3 8 = 4 6)
  • 若文本为2个字符,则编码为3个字符,尾部用一个"="补齐
  • 若文本为1个字符,则编码为2个字符,尾部用两个"="补齐

原文地址:http://blog.51cto.com/clovemfong/2160384

时间: 2024-08-07 09:19:13

BASE64编码原理与Golang代码调用的相关文章

BASE64编码原理分析脚本实现及逆向案例

BASE64编码原理分析脚本实现及逆向案例 0x01 简单介绍 数据传送时并不支持所有的字符,很多时候只支持可见字符的传送.但是数据传送不可能只传送可见字符为解决这个问题就诞生了base64编码.base64编码将所有待编码字符转换成64个可见字符表中的字符. 0x02 编码原理 被Base64编码之后所得到的所有字符都是在以下这个表当中的. 上表中总共有64个字符,2^6=64所以只需要6个bit位就足够描述所有的表中字符了.计算机中1个字节8个bit,一个ASCII码占1个字节.因此多出来的

Atitit.Base64编码原理与实现设计

Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说,转换方式可以分为四步:2 3.2. 注意2 3.3. Padding3 4. URL安全的Base64编码3 1. Base64编码 1.1. 为什么要用自己的base64编码方案 防止apache codec  jdk的jar冲突. 2. Base64编码由来 Base64最早是用来解决电子邮件

C# 字节流通过Base64编码转换成图片代码

C# 字节流通过Base64编码转换成图片代码 // 需载入以下的命名空间 // using System.IO; // using System.Drawing; // using System.Runtime.Serialization.Formatters.Binary; protected void Page_Load(object sender, EventArgs e) { byte[] buffer = ReadFile(Server.MapPath(@"\sex.txt"

Base64 编码原理

1.编码表 2.原理[汉字不能base64编码] base64 编码就是将字符以3个为一组,因为一个字符由8个位组成,3*8=24位,然后以顺序以6个位拿出,前面补2位,凑成8位--一个字节 原字节不能被3整除的,在后面补 由8个0,构成的单字节,一般补1个或是2个(0000 0000),这些后面补的字节不能用base64编码对应,应该是异常字符,用“=”号替换, 所以,base64编码一般最后会有1~2个“=”号 示例: base64编码前:Lucy L u c yASCII: 76 117

base64编码及JNI实现,代码非原创,只做整理和实现JNI端交互

直接上代码: #include <stdlib.h> #include <stdio.h> #include <getopt.h> #include <string.h> #include "base64.h" extern "C" { //Base64 编码 int Base64Encode(unsigned char *OrgString, unsigned char *Base64String, int OrgS

Base64编码原理及应用

最近在做一个H5上传图片并压缩的项目,其过程主要是先将图片上传通过readAsDataURL获取上传图片base64编码,然后根据高宽比将图片画到canvas上实现压缩,在通过toDataURL获取压缩后的图片.点击可查看demo在该过程中用到base64编码,于是就想弄清楚base64编码原理,才有了这篇博客. Base64编码的来历 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送.这样用途就

Base64编码原理分析

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位的状态只能是0或1: 字节:8个二进制位构成1个"字节(Byte)",字节是存储空间的基本计量单位.1个字节可以储存1个英文字母,2个字节可以存储1个汉字: Base64编码的作用 因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通

Base64编码原理与应用

本文内容转自网络,如需详细内容,请参考相关网址. http://my.oschina.net/goal/blog/201032 代码参考:http://blog.csdn.net/prsniper/article/details/7097643 Base64,它用作把任意序列的8位字节描述为一种不易被人直接识别的形式,常用作开发中用于传递参数.浏览器的img标签通过base64字符串来渲染图片以及电子邮件的正文编码等等. 在计算机中显示的字符,比如英文字母.数字以及英文标点符号就是用一个字节来存

一篇文章彻底弄懂Base64编码原理

在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一.在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输.那么,Base64到底起到什么作用呢? 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现