为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 32 字节哈希的二进制长度是 267 位而不是 256 位?

为什么 32 字节哈希的二进制长度是 267 位而不是 256 位?

Go
尚方宝剑之说 2023-08-07 10:49:57
假设您对某个字符串进行哈希处理以生成 256 位输出,为什么二进制表示的长度不是 256package mainimport (    "fmt"    "crypto/sha256")func main() {    s := "1"    m := sha256.Sum256([]byte(s))    fmt.Println(len(m))    b := fmt.Sprintf("%b\n", m[:])    fmt.Println(len(b))}输出:32 267
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

如果你打印它,你会立即看到它:


fmt.Println(b)

哪个输出:


[1101011 10000110 10110010 1110011 11111111 110100 11111100 11100001 10011101 1101011 10000000 1001110 11111111 1011010 111111 1010111 1000111 10101101 10100100 11101010 10100010 101111 11101 1001001 11000000 11110 1010010 11011101 10110111 10000111 1011011 1001011]

您正在打印一个数组,并且该包在各个字节的二进制表示之间fmt添加方括号和空格。[]另外,您还可以在格式字符串中添加换行符。


要仅获取位,您可以使用如下循环:


buf := &strings.Builder{}

for _, v := range m {

    fmt.Fprintf(buf, "%08b", v)

}

b2 := buf.String()

fmt.Println(b2)

fmt.Println(len(b2))

请注意,%08b格式字符串指定宽度为 8 并用作0填充(如果字节值小于 8 位)。


哪个输出:


0110101110000110101100100111001111111111001101001111110011100001100111010110101110000000010011101111111101011010001111110101011101000111101011011010010011101010101000100010111100011101010010011100000000011110010100101101110110110111100001110101101101001011

256

在Go Playground上尝试这些。



查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信