2 回答

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
您應(yīng)該使用它base64.DecodedLen
來(lái)查找解碼輸入所需的最大大小,然后使用n
返回的值Decode
來(lái)找出它實(shí)際寫(xiě)入該切片的時(shí)間。

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
由于輸入以 8 位字節(jié)編碼,但輸出以 6 位(radix-64)字節(jié)編碼,因此輸出需要是輸入大小的 8/6 = 4/3 倍。所以這應(yīng)該有效:
package main
import (
? ? "encoding/base64"
? ? "fmt"
)
func main() {
? ? str := "c29tZSBkYXRhIHdpdGggACBhbmQg77u/"
? ? dst := make([]byte, len(str)*len(str)/base64.StdEncoding.DecodedLen(len(str)))
? ? _, err := base64.StdEncoding.Decode(dst, []byte(str))
? ? if err != nil {
? ? ? ? fmt.Println("error:", err)
? ? ? ? return
? ? }
? ? fmt.Printf("%s\n", dst)
}
基于其中的實(shí)現(xiàn),DecodedLen()一般情況下返回輸入長(zhǎng)度的3/4倍:
// DecodedLen returns the maximum length in bytes of the decoded data
// corresponding to n bytes of base64-encoded data.
func (enc *Encoding) DecodedLen(n int) int {
? ? if enc.padChar == NoPadding {
? ? ? ? // Unpadded data may end with partial block of 2-3 characters.
? ? ? ? return n * 6 / 8
? ? }
? ? // Padded base64 should always be a multiple of 4 characters in length.
? ? return n / 4 * 3
}
但最后,我最終只是將輸入轉(zhuǎn)換為字符串并使用,DecodeString()因?yàn)樗呀?jīng)體現(xiàn)了這個(gè)邏輯。
- 2 回答
- 0 關(guān)注
- 202 瀏覽