go - 为什么 32 字节哈希的长度是 267 位二进制而不是 256 位?
问题描述
给定您散列一些字符串以产生 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上试试这些。
推荐阅读
- bash - 如何通过 Bash 脚本更新 YouTube 直播的标题?
- r - ggplot2:如何使图例在自动生成 6 时只有 2 个变量
- sql - 计算 PSQL 中的时间差,将 HH:MM 拆分为几列
- javascript - 如何在 Vue/Jhipster 项目中对齐 bootstrap-vue 卡片元素中心
- python - 无法使用 plotly 进行 3D 绘图。收到错误“无法从'plotly.io._utils'导入名称'plotly_cdn_url'”
- javascript - 如何将状态 base64 字符串设置为 React 中的图像?
- python - 如何将 Jupyter 笔记本转移到 exe
- jquery - 如何在 Promise 中适当地包装来自 jquery load() 的回调函数,以便我可以使用 await Promise.all?
- javascript - 如何使用 javascript 设置 css 顶部样式
- ios - 从 TabView 中的 NavigationLink 弹出会导致 tvOS 应用程序崩溃