Go使用Base64编解码

简介

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息。Go 的 encoding/base64 提供了对base64的编解码操作。

encoding/base64 定义了一个Encoding结构体,表示Base64的编/解码器。并且导出了四个常用的Encoding对象:StdEncoding、URLEncoding、RawStdEncoding、RawURLEncoding。StdEncoding表示标准的编/解码器。URLEncoding用于对URL编解码,编解码过程中会将Base64编码中的特殊标记+和/替换为-和_。RawStdEncoding和RawURLEncoding是StdEncoding和URLEncoding的非padding版本。主要API如下:

// 四个导出的编码/解码器 var StdEncoding = NewEncoding(encodeStd) var URLEncoding = NewEncoding(encodeURL) var RawStdEncoding = StdEncoding.WithPadding(NoPadding) var RawURLEncoding = URLEncoding.WithPadding(NoPadding) // Encoding 结构体表示编码/解码器 type Encoding struct { // ... } // Encoding提供了如下编解码的方法 // 解码,[]byte版本将src解码为dest,返回成功写入的字节数和错误 // string版本应用于字符串 func (enc *Encoding) Decode(dst, src []byte) (n int, err error) func (enc *Encoding) DecodeString(s string) ([]byte, error) // 编码,[]byte版本将src编码为dest // string版本应用于字符串 func (enc *Encoding) Encode(dst, src []byte) func (enc *Encoding) EncodeToString(src []byte) string // 设置enc的padding,返回Encoding指针,NoPadding表示不进行padding操作 func (enc Encoding) WithPadding(padding rune) *Encoding // 另外 encoding/base64 还提供了流式操作的接口 func NewDecoder(enc *Encoding, r io.Reader) io.Reader func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Encoding应用

下面的程序演示了 Encoding 的用法:

package main

import (
    'encoding/base64'
    'errors'
    'fmt'
)

// 为了方便,声明该函数,省去错误处理
func mustDecode(enc *base64.Encoding, str string) string {
    data, err := enc.DecodeString(str)
    if err != nil {
        panic(err)
    }
    return string(data)
}

// 该函数测试编解码
// enc为要测试的Encoding对象,str为要测试的字符串
func testEncoding(enc *base64.Encoding, str string) {
    // 编码
    encStr := enc.EncodeToString([]byte(str))
    fmt.Println(encStr)

    // 解码
    decStr := mustDecode(enc, encStr)
    if decStr != str {  // 编码后再解码应该与原始字符串相同
                        // 这里判断如果不同,则panic
        panic(errors.New('unequal!'))
    }
}

func main() {
    const testStr = 'Go语言编程'

    // 测试StdEncoding,注意打印结果里的/为URL中的特殊字符,最后有一个padding
    testEncoding(base64.StdEncoding, testStr)    // 打印:R2/or63oqIDnvJbnqIs=

    // 测试URLEncoding,可以看到/被替换为_
    testEncoding(base64.URLEncoding, testStr)    // 打印:R2_or63oqIDnvJbnqIs=

    // 测试RawStdEncoding,可以看到去掉了padding
    testEncoding(base64.RawStdEncoding, testStr) // 打印:R2/or63oqIDnvJbnqIs

    // 测试RawURLEncoding,可以看到/被替换Wie_,并且却掉了padding
    testEncoding(base64.RawURLEncoding, testStr) // 打印:R2_or63oqIDnvJbnqIs
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

流式API的应用

流式API多用于在数据传输过程中对数据进行Base64编码或解码。比如在读取较大文件时,或者网络传输时。下面的程序读取testfile中的数据,利用base64编码后保存到testfile_enc:

package main import ( 'encoding/base64' 'io' 'log' 'os' ) type Buf struct { data []byte size int } func main() { f, err := os.Open('E:\\testfile') if err != nil { log.Fatalln(err) } defer f.Close() fEnc, err := os.Create('E:\\testfile_enc') if err != nil { log.Fatalln(err) } defer fEnc.Close() w := base64.NewEncoder(base64.StdEncoding, fEnc) io.Copy(w, f) w.Close() }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
(0)

相关推荐

  • 真实案例(万字长文):Bad Code vs Good Code in Golang

    预计阅读时间: 23分钟 建议收藏后阅读 近来,经常有人问我在Go 语言的项目里,什么样的代码算好代码,什么样的代码算坏代码. 我发现这个练习很有趣.嗯,这个项目太有趣了,所以我决定写一篇博客和大家分 ...

  • 程序员技能必备几分钟搞懂各种编码内附汉字码实操案例

    背景 HTTP 协议基于文本传输,字符编码将文本变为二进制,二进制编码将二进制变为文本.TCP 协议基于二进制传输,数据读取时需要处理字节序.本文将介绍常见的字符编码.二进制编码及字节序,并一探 Go ...

  • Go - httpclient 常用操作

    httpclient 模块介绍 httpclient 是基于 net/http  封装的 Go HTTP 客户端请求包,支持常用的请求方式.常用设置,比如: 支持设置 Mock 信息 支持设置失败时告 ...

  • 密码学:一.异或加密

    异或加密是密码学中一种简单的加密算法,常作为更为复杂的加密算法的组成部分. 原理 异或运算:首先异或表示当两个数用二进制表示,进行异或运算时,当前位的两个二进制不同则为1相同则为0. A ⊕ 0 = ...

  • 什么是Base64编码?有什么用?编解码如何实现?

      本次为各位小伙伴带来的是一种网络上最常见的用于传输8Bit字节码的编码方式之一,base64编码,基于C语言实现.   原理性描述摘自:https://www.cnblogs.com/xq1314 ...

  • (推荐阅读)H264, H265硬件编解码基础及码流分析

    需求 在移动端做音视频开发不同于基本的UI业务逻辑工作,音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,v ...

  • 数字中间片格式GoPro CineForm成为SMPTE标准化编解码

    文件格式,跨平台,跨软件,压缩非压缩编码,这些要素给后期制作带来了不少困扰,如今GoPro CineForm成为SMPTE标准化编解码,小编曾在多年前就领教过CINEFORM的威力,现在大家可以来试着 ...

  • 数字视频编解码基础

    数字视频编解码基础

  • 直播源码APP,不同场景中最合适的编解码方式

    直播源码APP适合的封装格式有很多种,不同格式对应了不同的应用场景,不仅仅是视频,音频同样也采用这种方式. 一.视频封装格式 直播源码APP常用的封装格式有mp4.flv.ogv等,用来实现将视频流以 ...

  • 视频编解码技术VP8

    VP8,是On2 Technologies于2008年9月13日推出的.旨在取代其前任VP7的视频编解码器.相对于目前的VC-1.H.264等视频压缩格式,WebM VP8具有明显的技术提升,其加入了 ...

  • 谷歌新的Lyra语音编解码 AV1可以实现56kbps低带宽视频聊天

    谷歌的人工智能团队宣布了一种非常低比特率的语音压缩编解码器'Lyra',设计用于WebRTC和其他视频聊天等用途.Lyra的比特率非常低,当与AV1视频编解码器结合时,有可能允许通过56kbps的互联 ...

  • LDPC编解码初探

    目前SSD中ECC纠错代码主要两种BCH和LDPC.不过,随着SSD对ECC纠错技术要求越来越高,BCH纠错码开始有些吃力,所以,LDPC纠错码是发展趋势,也是最新最主流的纠错码. 为何需要LDPC? ...

  • 一套优质成品短视频APP的搭建部署,离不开的软硬编解码

    一款优质的短视频APP诞生并非易事,开发过程也是需要考虑各种问题,包括音视频问题.开屏速度等等.无论是短视频还是直播,都要经过无数次的测试.优化等步骤完成. 那么今天我们就来看一下,短视频直播源码如何 ...