-1

文字列をハッシュして 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
4

1 に答える 1

6

印刷すると、すぐに表示されます。

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でこれらを試してみてください。

于 2019-11-14T10:41:14.853 に答える