当前位置:网站首页>golang利用异或^交换两个变量以及加解密

golang利用异或^交换两个变量以及加解密

2022-06-11 11:26:00 会飞的胖达喵

使用异或交换两个变量

// 不适用临时变量tmp 
// 利用异或的特性 形同为0 不同为1
func swap(a, b int) (int, int) {
    
	a ^= b // 异或等于运算 相同为0 不同为1 0000 0010 (a=2) ^ 0000 0011 (b=3) = 0000 0001 (a=1)
	b ^= a // 0000 0011 (b=3) ^ 0000 0001 (a=1) = 0000 0010 (b=2)
	a ^= b // 0000 0001(a=1) ^ 0000 0010 (b=2) = 0000 0011 (a=3)
	return a, b
}

可以利用异或的特性加密文件

加密
func main() {
    
	const key = 11
	var (
		d  byte
		s  string = "abc"
		ds string
		dsSlice []byte
	)
	//加密

	for _, v := range s {
    
		d = byte(v ^ key)
		dsSlice = append(dsSlice, d)
		fmt.Printf("加密之后byte:%v,字符:%s,原字符为:%s\n",d,string(d),string(v))
	}
	ds = string(dsSlice)
	fmt.Printf("明文:%s 密文:%s\n",s,ds)
	// 解密
	dsSlice = dsSlice[:0]
	for _, v := range ds {
    
		d = byte(v ^ 11)
		dsSlice = append(dsSlice, d)
		fmt.Printf("解密之后byte:%v,字符:%s,原字符为:%s\n",d,string(d),string(v))
	}
	s = string(dsSlice)
	fmt.Printf("密文:%s 明文:%s\n",ds,s)
}
//加密之后byte:106,字符:j,原字符为:a
//加密之后byte:105,字符:i,原字符为:b
//加密之后byte:104,字符:h,原字符为:c
// 明文:abc 密文:jih
//解密之后byte:97,字符:a,原字符为:j
//解密之后byte:98,字符:b,原字符为:i
//解密之后byte:99,字符:c,原字符为:h
// 密文:jih 明文:abc
原网站

版权声明
本文为[会飞的胖达喵]所创,转载请带上原文链接,感谢
https://pangda.blog.csdn.net/article/details/125231741