我想编码一个SHA-256输出(十六进制)给我一个16字符的base64字符串用于密码使用目的。 base64似乎不是我认为它应该是什么。这就是我想要的。
(0) "00000000000000000000000000000000" -> "AAAAAAAAAAAAAAAA"
(64) "00000000000000000000000000000040" -> "AAAAAAAAAAAAAABA"
(255) "000000000000000000000000000000ff" -> "AAAAAAAAAAAAAAC/"
(2^16+16) "0000000000000000000000000000100f" -> "AAAAAAAAAAAAAPAP"
继承人我得到了什么
base64encode("00000000000000000000000000000000")
"MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAA"
此结果与在线转换器一致,使用R等, 所以很明显base64并不是我认为的,我正在尝试做别的事情。如果我不想“在64位编码”,我想做什么?
我最喜欢的是:
> base64encode(64)
[1] "AAAAAAAAUEA="
> base64encode("64")
[1] "NjQA"
这让我很困惑
答案 0 :(得分:1)
Base64适用于字节数组,因此在您的示例中,base64encode("00000000000000000000000000000000")
将字符串值" 000 ..."编码为字节数组。由于字符的字节值" 0"是0x30,你基本上编码一个由32个0x30
字节组成的字节数组(并且通过它的外观,最后是一个空终止符(0x00))。
如果您尝试获得16个字符的输出,则需要对12个字节的输入进行编码(因为Base64为3个字节的输入产生4个字符的输出),例如: (你不会提供语言,所以我猜测字节数组的语法为{ 0x.., 0x.., ... }
):
base64encode({0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
= "AAAAAAAAAAAAAAAA"
base64encode({0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
= "AAAAAAAAAAAAAAAB"
base64encode({0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40})
= "AAAAAAAAAAAAAABA"
etc...
SHA-xxx算法应该自然地产生一个字节数组输出,因此您应该能够从中获取适当的字节数,并将它们传递给base64encode
。如果SHA方法产生十六进制字符串输出,那么在传递Base64编码之前,您需要将十六进制字符串转换回字节数组。