眾所周知,在 gobase64.StdEncoding或base64.RawStdEncoding. 如何正確使用其中之一來解碼一個 base64 字串?如果呼叫了不正確的編碼方法。例如,如果RawStdEncoding用于解碼一個StdEncoding字串,illegal base64 data at input byte xxx則會出現錯誤。
每個檔案
const (
StdPadding rune = '=' // Standard padding character
NoPadding rune = -1 // No padding
)
RawStdEncoding 是標準的原始、未填充的 base64 編碼,如 RFC 4648 第 3.2 節中所定義。這與 StdEncoding 相同,但省略了填充字符。
我們是否應該通過檢查填充的結尾是否來區分它們StdPadding?代碼片段
lastByte := s[len(s)-1:]
if lastByte == string(base64.StdPadding) {
base64.StdEncoding.DecodeString(s)
} else {
base64.RawStdEncoding.DecodeString(s)
}
這是一種優雅的方式嗎?或者我錯過了什么?解碼base64字串的優雅方法是什么?
更新:
也許通過錯誤檢查來做到這一點的一種原始方法如下
rawByte, err := base64.StdEncoding.DecodeString(s)
if err != nil {
rawByte, err = base64.RawStdEncoding.DecodeString(s)
}
uj5u.com熱心網友回復:
我們知道,在 go base64.StdEncoding 或 base64.RawStdEncoding 中有兩種方法可以解碼 base64 字串。
還有base64.URLEncoding它使用字符-并_替代 URL 不安全的 base64 字符 和/.
我們是否應該通過檢查填充的結尾是否為 StdPadding 來區分它們?代碼片段
這行不通。base64 編碼沒有可見填充的可能性有三分之一:
b := []byte("abc123") // len(b) % 3 == 0 - no padding
fmt.Println(base64.StdEncoding.EncodeToString(b)) // YWJjMTIz
fmt.Println(base64.RawStdEncoding.EncodeToString(b)) // YWJjMTIz
https://play.golang.org/p/LMtIHlyXdn7
那么你如何區分它們 - 并確定使用了哪種編碼?
是的,您可以像在更新的問題中一樣進行雙重解碼:
rawByte, err := base64.StdEncoding.DecodeString(s)
if err != nil {
rawByte, err = base64.RawStdEncoding.DecodeString(s)
}
您可以使用一些技巧來做出一些有根據的猜測。例如:
e := base64.StdEncoding.EncodeToString(b) // always produces a mutiple of 4 length
if len(e) % 4 != 0 {
// cannot be base64.StdEncoding - so try base64.RawStdEncoding?
}
uj5u.com熱心網友回復:
如果你得到illegal base64 data at input byte ...那么:
- 您要么使用了錯誤的 base64 解碼器,要么
- 在呼叫解碼器之前必須去除 base64 字串之后的更多資料,或者
- 輸入不是 base64。
我們是否應該通過檢查填充的結尾是否為 StdPadding 來區分它們?
號就像你知道的資料是,在所有的base64編碼,你也應該知道究竟是如何被編碼和使用例如無論是 base64.StdEncoding 或 base64.RawStdEncoding,而不是兩個。這些東西你不用猜,直接用對應發送方使用的編碼的decode方法就可以了。
Base64 編碼的不同之處在于:
- 填充/未填充(
=末尾沒有s) - 標準 (
,/) 或 URL (-,_) 字母 - 帶/不帶換行符(例如 MIME 在 76 個字符上拆分行,在 64 個字符上拆分 PEM)
您可以直觀地檢查編碼字串以猜測編碼方案。但請注意,填充并不總是存在 - 這取決于源資料的長度是否為 3 的倍數,因為每個 3 位元組的元組都被編碼為 4 個 6 位字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/343562.html
