gpt4 book ai didi

go - 如何在golang中将65537转换为AQAB

转载 作者:行者123 更新时间:2023-12-01 22:20:48 31 4
gpt4 key购买 nike

我正在编写一些有关JWT创建和验证的单元和集成测试。我正在使用我使用openssl创建的真实(具有良好自签名)证书来共同整理一个快速的JWKS页面,我一直在做饭,直到遇到一个非常简单的问题:
“E”值为65537,但是在JWKS中,它假定为AQAB。经过很长一段时间在墙上敲打我的头后,我终于在纸上找到了答案。
https://tools.ietf.org/html/rfc7518#section-6.3.1.2
65537是
0000 0001:0000 0000:0000 0001
如果将base64的位数转换为6位,则会得到
000000 010000 000000 000001
这是A Q A B
https://en.wikipedia.org/wiki/Base64#Base64_table
因此,我尝试编写一些快速代码。但是事实证明这不是很迅速。我在想,一定有更简单的方法。我尝试的所有base64编码都给了我3个以上的字节。
任何有自尊心的编码员也会这样做。。。我看到每个人都使用65537,所以我对那个傻逼进行了硬编码,然后继续前进,但是它一直困扰着我。我讨厌让我烦恼的问题。
我得到的最接近的是:

bs := make([]byte, 4)
binary.BigEndian.PutUint32(bs, 65537)
fmt.Println(bs)
fmt.Println(base64.URLEncoding.EncodeToString(bs))
哪个产生了:
[0 1 0 1]
AAEAAQ==
我的快速数学说的是,base64输出就是为什么超过3个字节的原因:D

最佳答案

您正在对4个二进制字节进行base64编码:

bs := make([]byte, 4) // `AAEAAQ==`
它将产生6( 4*8/6)base64个字符-加上 ==填充。
您要编码三个二进制字节-这将产生4个( 3*8/6)base64字符。
bs := []byte{1, 0, 1}
fmt.Println(bs)
fmt.Println(base64.URLEncoding.EncodeToString(bs)) // `AQAB`
https://play.golang.org/p/gDviu06pftR

编辑
因此,您只需要低3个字节(如果使用BigEndian,则在最后)。
因此,您可以使用原始代码:
bs := make([]byte, 4)
binary.BigEndian.PutUint32(bs, 65537)

bs = bs[1:] // drop most significant byte - leaving least-significant 3-bytes

fmt.Println(base64.URLEncoding.EncodeToString(bs)) // `AQAB`
或者,如果您查看 binary.BigEndian.PutUint32的来源,则可以看到它如何从 uint32中提取4个字节-并对3个字节执行相同操作:
bs := make([]byte, 3)

v := 65537
bs[0] = byte(v >> 16)
bs[1] = byte(v >> 8)
bs[2] = byte(v)

fmt.Println(base64.URLEncoding.EncodeToString(bs)) // `AQAB`
https://play.golang.org/p/xTNzZMeQWVx

关于go - 如何在golang中将65537转换为AQAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63626188/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com