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

标签 go bit-representation

给定您对某个字符串进行散列以产生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上尝试这些。

关于go - 为什么32字节哈希的长度是二进制的267位而不是256位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854726/

相关文章:

go - 如何有选择地编码(marshal)结构的 JSON?

c - 关于 "object having more than one object representation"的未指定行为

google-app-engine - 云数据存储 client.GetAll 类型不匹配但 client.Get 有效

go - 如何捕获 channel 死锁的异常?

date - Go:比较两个只考虑日期的时间结构

factorization - 关于两个数之间关系的问题

html - 无法在 html 中显示结构 slice

C++ 和无符号类型

matlab - 有没有办法颠倒matlab中的位顺序