首页 > 其他分享 >golang 对字符串进行base64编解码、md5 编码

golang 对字符串进行base64编解码、md5 编码

时间:2023-09-24 17:12:05浏览次数:28  
标签:编解码 编码 fmt base64 golang encoded data md5

内容来自对 chagpt 的咨询

一、对字符串进行 base64 编解码

base64 编码

要在Go语言中对字符串进行base64编码,你可以使用标准库中的encoding/base64包。以下是一个简单的示例:

package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
	data := "Hello, World!"
	encoded := base64.StdEncoding.EncodeToString([]byte(data))
	fmt.Println("Encoded:", encoded)
}

在Base64编码中,所有的字母数字都是安全的('A'到'Z','a'到'z'和'0'到'9')。但是,Base64有两个额外的字符:'+'和'/',它们在某些系统(例如URL)中可能并不安全。

因此,Base64提供了一个"URL和文件名安全"的变体Base64url(也称为URL安全的Base64),它使用"-"和"_"替换"+"和"/",消除了需要URL编码的需要。

这主要是在URL,Cookie,文件名等场景中使用Base64编码的时候需要考虑的问题,因为"+","/"和"="在这些环境中可能有特殊含义(例如URL中的路径分隔,查询字符串开始等)。

在Go语言中,可以使用base64.URLEncoding代替base64.StdEncoding达到URL安全的Base64编码,例如:

encodedURLSafe := base64.URLEncoding.EncodeToString([]byte(data))

或者先用 base64.StdEncoding 编码后,手动将 "+","/" 替换成 "-"和"_"

	data := "Hello, World!"
	encoded := base64.StdEncoding.EncodeToString([]byte(data))
	fmt.Println("Encoded:", encoded)
	encoded = strings.ReplaceAll(encoded, "/", "_")
	encoded = strings.ReplaceAll(encoded, "+", "-")
    fmt.Println("Encoded:", encoded)

base64 解码

如果使用 base64.StdEncoding.EncodeToString 进行编码,那么使用 base64.StdEncoding. DecodeString 进行解码;同理,如果使用 base64.URLEncoding.EncodeToString 进行编码,那么使用 base64.URLEncoding. DecodeString 进行解码;

package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
    // 需要进行编码的字符串
	data := "hello world"

	// 使用 base64.URLEncoding 对字符串进行 base64 编码
	encoded := base64.URLEncoding.EncodeToString([]byte(data))

	fmt.Println("Original String: ", data)
	fmt.Println("Base64 Encoded String: ", encoded)

	// 使用 base64.URLEncoding 进行解码
	decodedByte, err := base64.URLEncoding.DecodeString(encoded)
	if err != nil {
		log.Fatal("Decode Error:", err)
	}
	
	// 将字节切片转换为字符串
	decoded := string(decodedByte)
	fmt.Println("Base64 Decoded String: ", decoded)
}

二、md5 编码

在 Go 语言中,我们可以使用 crypto/md5 库来对字符串或其他数据进行 MD5 编码。以下是一个示例代码段:

package main

import (
	"crypto/md5"
	"fmt"
	"io"
)

func main() {
	data := "Hello, World"
	hash := md5.New()
	io.WriteString(hash, data)

	md5Code := fmt.Sprintf("%x", hash.Sum(nil))
	fmt.Println(md5Code)
}

在上面的代码中,我们首先导入了 crypto/md5 和 fmt 库。我们创建了一个新的 MD5 hash,并将要进行编码的数据(在这种情况下是字符串 "Hello, World")写入 hash 中。然后我们使用 Sum 函数得到编码后的数据,并将其转化为十六进制的字符串形式打印出来。

另一种简单形式

package main

import (
	"crypto/md5"
	"fmt"
	"io"
)

func main() {
	data := "Hello, World"
    fmt.Sprintf("%x", md5.Sum([]byte(data)))
}

标签:编解码,编码,fmt,base64,golang,encoded,data,md5
From: https://www.cnblogs.com/hi3254014978/p/17726242.html

相关文章

  • golang 把内容写到 csv 文件或者 xlsx 文件里
    内容来自对chatgpt的咨询csv格式csv格式的文件使用wps或者office打开后是一个excel表格的形式,很容易看到表格里的数据。csv格式跟markdown格式有点像,只需要按照固定的语法放置文本,保存后,用对应的渲染软件打开,就能得到想要的效果。比如下面这段json,用文本编辑器......
  • 从一个golang 员工emp数组中,找到其中name相同的元素,把结果放到一个新数组里,代码实现
    内容来自对chatgpt的咨询为了找到具有相同名称的员工,并将结果放入一个新的数组中,我们可以首先使用一个映射(map)来存储每个名称及其出现的次数。然后,我们可以遍历原始数组并使用映射来判断是否有重复的名称。以下是一个示例代码,演示如何实现这一目标:packagemainimport( ......
  • 字符串转16进制,16进制转Base64 哈哈哈 uf65/rn+
    测试:哈哈哈uf65/rn+场景描述:对接java接口,字符串转16进制再转base64;遇到转换不一样问题;后来定位对方编码格式不对; privatevoidTest(){stringstr="哈哈哈";str=GetHexByString(str,Encoding.GetEncoding("GB18030"));//Encodi......
  • Docker - ERROR: failed to solve: golang:latest: error getting credentials - err:
    Dockerfile:FROMgolang:latestWORKDIR/appADD..RUNgoenv-wGOPROXY=https://goproxy.io,directRUNgogetRUNgobuild-oapp.CMD["/app/app"] zzh@ZZHPC:/zdata/MyPrograms/Go/aaa$dockerbuild-ttest:v1.[+]Building1.3s(3/3)FINI......
  • delphi Base64转换(加密、解密)
    Base64转换(加密、解密)代码字符串加密、解密usesSystem.NetEncoding;procedureTForm1.Button1Click(Sender:TObject);varstr1,str2:string;begin//加密str1:=TNetEncoding.Base64.Encode('测试数据');Memo1.Lines.Add('加密数据'+str1);//解密s......
  • golang 有没有 类似 typescript 的 联合类型?
    Go语言(Golang)不像TypeScript那样直接支持联合类型(UnionTypes)。在TypeScript中,联合类型允许一个变量具有多个不同的数据类型,而在Go中,通常使用接口(interfaces)和具体类型来处理类似的情况。以下是在Go中处理联合类型的一些方法:使用接口:Go中的接口可以用于定义一组方法的契约,而不是特......
  • 最简单的方式实现 Golang的级别日志
    lo.gopackageloimport("log""os")const(TRACEint=iotaDEBUGINFOWARNERRORFATAL)typeLevelLoggerstruct{levelintlogger*log.Logger}varl*LevelLoggerfuncinit(){......
  • File文件流与base64图片格式转换
    //base64转文件exportfunctionbase64ToFile(base64:any,fileName:string){if(!base64)returnletdata=base64.split(',');lettype=data[0].match(/:(.*?);/)[1];constbstr=window.atob(data[1]);letn=bstr.length;constu8arr=......
  • 任正非“苹果是华为的老师”;音频编解码标准 L2HC 发布;GNU 和自由软件运动四十周年丨RT
    开发者朋友们大家好:这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留......
  • golang 实现 socks5 正向代理服务器
    socks5proxy.gopackagemainimport("encoding/binary""errors""flag""fmt""io""net""strconv")varportintfuncmain(){flag.IntVar(&port,......