Расшифруйте base64 и закодируйте его в hex - PullRequest
0 голосов
/ 08 июля 2019

У меня следующий код, который декодирует base64, а затем кодирует его в шестнадцатеричный код.

doc_id := "Can35qPeFkm9Xgmp9+aj3g=="
base64_decode, err := base64.StdEncoding.DecodeString(doc_id)
if err != nil {
log.Fatal("error:", err)
}
base64_decoded := fmt.Sprintf("%q", base64_decode)
fmt.Printf("base_decoded %v\n", base64_decoded)



src := []byte(base64_decoded)
fmt.Println(src)
hex_encode := make([]byte, hex.EncodedLen(len(src)))
hex.Encode(hex_encode, src)
hex_encoded := fmt.Sprintf("%s", hex_encode)
fmt.Printf("hex_encoded %v", hex_encoded)

где doc_id - это формат base64. base64_decoded - это его декодированное значение. Я должен закодировать его в hex, поэтому я передаю его в src.

Проблема в том, что когда я передаю идентификатор base64_decoded в src, я ошибаюсь, когда передаю значение, которое содержит base64_decoded, я получаю правильный ответ. например: если я получу base64_decoded значение как "\ x11z \ xc0 [d ~ \ xfcK \ xb1 \ xf8 \ x11z \ xc0 [d ~" " если я передам его значение "\ x11z \ xc0 [d ~ \ xfcK \ xb1 \ xf8 \ x11z \ xc0 [d ~" ", я получу правильный ответ 117ac05b647efc4bb1f8117ac05b647e

если я передам переменную, содержащую "\ x11z \ xc0 [d ~ \ xfcK \ xb1 \ xf8 \ x11z \ xc0 [d ~" ", я получу неправильный ответ

Есть ли что-то с этим назначением base64_decoded: = fmt.Sprintf ("% q", base64_decode)

что я делаю не так

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Используйте следующий код:

doc_id := "Can35qPeFkm9Xgmp9+aj3g=="
base64_decode, err := base64.StdEncoding.DecodeString(doc_id)
if err != nil {
    log.Fatal("error:", err)
}
fmt.Println(hex.EncodeToString(base64_decode))

Непосредственное кодирование байтов в base64_decode как шестнадцатеричное.

Вызов fmt.Sprintf("%q", base64_decode) возвращает строку с экранированными байтами в соответствии с строковыми литеральными правилами Go. В общем случае байты в возвращаемой строке не равны байтам в base64_decode. Например, входной байт 0x11 экранируется до четырех байтов \x11.

0 голосов
/ 09 июля 2019

происходит то, что преобразование, которое fmt.Sprintf ("% q", base64_decode) делает в base64_decode, в этом процессе для преобразования некоторых байтов в памяти теряется.

здесь, ниже вы оставляетепример: https://play.golang.org/p/pdQBp7NsvQM

doc_id := "Can35qPeFkm9Xgmp9+aj3g=="
var_encode := b64.StdEncoding.EncodeToString([]byte(doc_id))
fmt.Println(var_encode)
var_decode , _ := b64.StdEncoding.DecodeString(var_encode)
fmt.Println(string(var_decode))
...