簡體   English   中英

獲取base64解碼數據的長度

[英]Get length of base64 decoded data

我需要計算base64解碼數據的長度。

我有Base-64數據,我正在將未編碼的數據作為HTTP響應的主體發送(典型值:我的意思是請求,但想法相同)。

我需要發送一個Content-Length標頭。

出於內存使用和性能的考慮,我寧願不是實際上將Base-64一次解碼所有數據,而是將其流式傳輸。

給定base64數據,如何計算解碼數據的長度? 我需要通用算法或Java / Scala解決方案。


編輯:這類似於,但不是重復的計算實際數據大小從Base64編碼的字符串的長度 ,在OP詢問

...我可以僅通過查看 Base64編碼的字符串的長度來計算已編碼的原始數據的長度嗎?

答案是不。 還必須注意填充。

我想知道如何使用長度和base64數據來計算原始長度。

假設您不能只使用分塊編碼(從而避免發送Content-Length標頭),則需要查詢填充:

  • Base64將三個二進制八位字節編碼為四個字符。 您有4N個Base64字符。 令k為結尾的'='字符數(即填充字符:0、1或2)。
  • 令M = 3 * floor((Nk)/ 4),即“完整”的3個八位字節組中的八位字節數。
  • 如果您有2個填充字符,則您有M + 1個字節。
  • 如果您有1個填充字符,則您有M + 2個字節。
  • 如果您有0個填充字符,則您有M個字節。

當然,在這種情況下,floor()意味着截斷整數除法,即法線/運算符。

大概您可以相對輕松地計算填充八位字節(例如,通過查找文件的末尾或通過查看字節數組的末尾),而不必順序讀取整個Base64編碼的東西。

我得出了這個簡單的計算。

如果L是Base-64編碼數據的長度,而p是填充字符的數量(將為0、1或2),則未編碼數據的長度為

L * 3 / 4 - p

就我而言(使用Scala),

bytes.length * 3 / 4 - bytes.reverseIterator.takeWhile(_ == '=').length

注意:這是假定數據沒有行分隔符。 (通常,Base-64數據每72個字符左右會有換行符。)如果這樣,則從長度L排除行分隔符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM