我正在對 base64 字符串進行簡單的解碼。當我重新編碼時,我沒有得到相同的字符串。我錯過了什么?String base64 = "R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edf";byte[] decoded = Base64.getDecoder().decode(base64.getBytes());String encoded = Base64.getEncoder().encodeToString(decoded);您可以看到該字符串encoded與輸入字符串不同base64:R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edc=
1 回答

守候你守候我
TA貢獻1802條經驗 獲得超10個贊
Base64通過從 64 (6 位)可顯示字符(4 * 6 = 24 位)中進行選擇,將 3 個字節(3 * 8 = 24 位)編碼為 4 個字符。有關其工作原理的詳細說明,請參閱維基百科。
因此,對于每 4 個編碼字符,您將獲得 3 個字節。您的輸入是:
R3df 789G Sfsb 2edf SFSD Fuik uikk 2349 GSfs b2ed fSvF SDFR 3df7 89GS fsb2 edf
如您所見,這是 15 個 4 個字符的塊,最后一個塊只有 3 個字符。3 個字符(3 * 6 = 18 位)可以存儲 2 個字節(2 * 8 = 16 位),留下 2 個未使用的位。這 2 位可以具有任何值,因為它們未被使用,但標準是將此類額外位設置為 0。
您的輸入來自 Base64 編碼,該編碼選擇將額外位設置為 1,因此最后一個字符是f
,而不是標準的c
.
通過=
在末尾添加 1 或 2 個符號來將編碼文本填充到完整塊也是很常見的,盡管并不總是必需的。因此,使用 0 作為額外位并添加填充的標準,最終塊變為edc=
,但它解碼為與 的非標準最終塊相同的字節edf
。
添加回答
舉報
0/150
提交
取消