Home / PostsPost

PHP 的 pack 及 unpack 用golang实现

嘟噜聪2020/03/26 16:03:30 [Golang] [go] [PHP] [pack] 502人已阅

简介 在php开发中可能会偶尔使用到两个函数`pack`。php官网的解释是“将数据打包成二进制字符串”。用golang语言重写php项目时需要对它进行处理,以下是我总结出来的方案。## Demo

在php开发中可能会偶尔使用到两个函数pack。php官网的解释是“将数据打包成二进制字符串”。用golang语言重写php项目时需要对它进行处理,以下是我总结出来的方案。

Demo

假设现在有一个加密好的字符串编码如下,我们将其进行pack后再使用base64进行encode成字符串,

42b44ba7914754901374e4887a2fd51367fa63d0b7d2f48fd78e87054e0992b3c18ca0336d735d5dc9fd8781023e5be63db1121d179976c02940973d9e5c482a12c2e57f78ddd7ec550569afb5bbf6f62b045b5360423457d6ba0b675f5603fa8aa2fd254a99cfcd6435c2a6d20a07456d575ed36ada80b766932b2fcd07ca64

PHP 的实现方式是这样的:

$testStr = "42b44ba7914754901374e4887a2fd51367fa63d0b7d2f48fd78e87054e0992b3c18ca0336d735d5dc9fd8781023e5be63db1121d179976c02940973d9e5c482a12c2e57f78ddd7ec550569afb5bbf6f62b045b5360423457d6ba0b675f5603fa8aa2fd254a99cfcd6435c2a6d20a07456d575ed36ada80b766932b2fcd07ca64"

echo base64_encode(pack('H', $testStr)); // H 十六进制字符串,高位在前

最终输出:

QrRLp5FHVJATdOSIei/VE2f6Y9C30vSP146HBU4JkrPBjKAzbXNdXcn9h4ECPlvmPbESHReZdsApQJc9nlxIKhLC5X943dfsVQVpr7W79vYrBFtTYEI0V9a6C2dfVgP6iqL9JUqZz81kNcKm0goHRW1XXtNq2oC3ZpMrL80HymQ=

Golang 的实现方式

实现一个函数,以每两个字符为单位,将16位的字符串转换成10进制,以下函数:

// 字符串转16进制
func StringTo16BaseByte(s string) []byte {
	var str16 []byte
	for i := 0; i < len(s); i++ {
		if i%2 == 0 {
			n := i + 2
			x, _ := strconv.ParseUint(s[i:n], 16, 32)
			str16 = append(str16, byte(x))
		}
	}
	return str16
}

目前只考虑高位在前的情况,低位在前或其他方式还可能需要用到这个包encoding/binary

验证:

// 测试字符串

testStr := "42b44ba7914754901374e4887a2fd51367fa63d0b7d2f48fd78e87054e0992b3c18ca0336d735d5dc9fd8781023e5be63db1121d179976c02940973d9e5c482a12c2e57f78ddd7ec550569afb5bbf6f62b045b5360423457d6ba0b675f5603fa8aa2fd254a99cfcd6435c2a6d20a07456d575ed36ada80b766932b2fcd07ca64"

fmt.Println(base64.StdEncoding.EncodeToString(StringTo16BaseByte(testStr)))

最终输出:

QrRLp5FHVJATdOSIei/VE2f6Y9C30vSP146HBU4JkrPBjKAzbXNdXcn9h4ECPlvmPbESHReZdsApQJc9nlxIKhLC5X943dfsVQVpr7W79vYrBFtTYEI0V9a6C2dfVgP6iqL9JUqZz81kNcKm0goHRW1XXtNq2oC3ZpMrL80HymQ=

尾巴

如果我写的内容对您有用,谢谢大家了

很赞哦! (1)

文章评论

标签

站点信息

  • 微信公众号