为什么 32 字节散列的长度在二进制中是 267 位而不是 256 位?

Why is the length of a 32 byte hash 267 bits in binary and not 256 bits?

假设您对一些字符串进行哈希处理以生成 256 位输出,为什么二进制表示的长度不是 256

package main

import (
    "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

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

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 上试试这些。