第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用Go的base64.StdEncoding.Decode()方法:如何選擇目標(biāo)字節(jié)片的大???

我想使用Decode(https://golang.org/pkg/encoding/base64/#Encoding.Decode)來(lái)解碼一段字節(jié),并且想知道,給定這個(gè)方法簽名,func (enc *Encoding) Decode(dst, src []byte) (n int, err error)如何選擇dst字節(jié)切片的大小,使其足夠大以捕獲輸出。例如,此代碼片段(改編自https://golang.org/pkg/encoding/base64/#Encoding.DecodeString)package mainimport (    "encoding/base64"    "fmt")func main() {    str := "c29tZSBkYXRhIHdpdGggACBhbmQg77u/"    dst := make([]byte, 1024)    _, err := base64.StdEncoding.Decode(dst, []byte(str))    if err != nil {        fmt.Println("error:", err)        return    }    fmt.Printf("%s\n", dst)}印刷some data with  and ?但是,如果我選擇的尺寸dst太小(例如0),我會(huì)感到index out of range恐慌:panic: runtime error: index out of rangegoroutine 1 [running]:encoding/base64.(*Encoding).decodeQuantum(0xc000084000, 0x1193018, 0x0, 0x0, 0xc000080f30, 0x20, 0x20, 0x4, 0x10, 0x10, ...)    /usr/local/Cellar/go@1.12/1.12.12/libexec/src/encoding/base64/base64.go:352 +0x567encoding/base64.(*Encoding).Decode(0xc000084000, 0x1193018, 0x0, 0x0, 0xc000080f30, 0x20, 0x20, 0xc000080f38, 0x105779d, 0x10b16e0)    /usr/local/Cellar/go@1.12/1.12.12/libexec/src/encoding/base64/base64.go:500 +0x5aamain.main()    /Users/kurt/Documents/Scratch/base64_decode.go:11 +0xb4exit status 2如何dst根據(jù) 的大小選擇 的大小src以可靠地解碼輸入?
查看完整描述

2 回答

?
忽然笑

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊

您應(yīng)該使用它base64.DecodedLen來(lái)查找解碼輸入所需的最大大小,然后使用n返回的值Decode來(lái)找出它實(shí)際寫(xiě)入該切片的時(shí)間。



查看完整回答
反對(duì) 回復(fù) 2023-08-14
?
侃侃無(wú)極

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è)邏輯。


查看完整回答
反對(duì) 回復(fù) 2023-08-14
  • 2 回答
  • 0 關(guān)注
  • 202 瀏覽
慕課專(zhuān)欄
更多

添加回答

了解更多

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)