Как сравнить [32] байт с [] байтом в golang?

Я хочу сравнить вывод sha256.Sum256(), который составляет [32] байта с [] байтом.

Я получаю сообщение об ошибке "несовпадающие типы [32]byte и []byte". Я не могу преобразовать [] байт в [32] байт.

Есть ли способ сделать это?


person Sumit Rathore    schedule 04.01.2015    source источник


Ответы (2)


Вы можете тривиально преобразовать любой массив ([size]T) в срез ([]T), нарезав его:

x := [32]byte{}
slice := x[:] // shorthand for x[0:len(x)]

Оттуда вы можете сравнить его со своим фрагментом, как если бы вы сравнили любые два других фрагмента, например.

func Equal(slice1, slice2 []byte) bool {
    if len(slice1) != len(slice2) {
        return false
    }

    for i := range slice1 {
        if slice1[i] != slice2[i] {
            return false
        }
    }

    return true
}

Редактировать: как Дейв упоминает в комментариях, в пакете bytes также есть метод Equal, bytes.Equal(x[:], y[:])

person LinearZoetrope    schedule 04.01.2015
comment
Вы также можете использовать bytes.Equal(x[:], y[:]) - person Dave; 09.08.2015

Я получил ответ, используя эту тему

SHA256 в Go и PHP дает разные результаты

    converted := []byte(raw)
    hasher := sha256.New()
    hasher.Write(converted)
    return hex.EncodeToString(hasher.Sum(nil)) == encoded

Это не преобразование [32] байта в [] байт, но используется другая функция, которая не выдает результат в [32] байте.

person Sumit Rathore    schedule 04.01.2015
comment
Это может быть неприменимо к исходному вопросу, если encoded представляет собой фрагмент неинтерпретированных байтов. Это работает только в том случае, если encoded следует интерпретировать как base64-кодировку контрольной суммы. - person dyoo; 04.01.2015