簡體   English   中英

Convert.ToBase64String是否返回與其源字節數組相同的長度?

[英]Does Convert.ToBase64String return the same length as it's source byte array?

我不知道我是否在問一個愚蠢的問題,但我想知道.NET中的Convert.ToBase64String函數返回的長度是否與源字節大小相同還是不同? 我想嘗試一下MSDN上的文章如何:使用帶有SQL Server 2000的表單身份驗證來哈希密碼,但是我發現他們用來創建鹽串的函數返回的長度比應該返回的長度長3倍。 這里要澄清的是該文章中的代碼。

private static string CreateSalt(int size)
{
   // Generate a cryptographic random number using the cryptographic
   // service provider
   RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
   byte[] buff = new byte[size];
   rng.GetBytes(buff);
   // Return a Base64 string representation of the random number
   return Convert.ToBase64String(buff);
}

不,Base64返回3字節輸入的4字節輸出,向上舍入(用=填充)到下一個4字節邊界。

int outputLength = ((inputLength+2)/3)*4

這是因為每個字節僅使用6位(基本上是0-63),以便僅使用非控制字符且在7位范圍內的ASCII字符。 因此,使用Base64編碼數據時,將獲得3 * 8 => 4 * 6位。

base-64很少返回與輸入長度相同的字符串。 本質上,它僅使用8個可用位中的6個,因此大消息(特別是)將需要額外的1/3容量。 最后有幾個打包字節(通常為“ =”),以使消息明確。

字節字符串的base64編碼比字節字符串長,因為該字節字符串每個“位置”具有2 ^ 8的可能性,而基數64字符串每個位置僅具有2 ^ 6的可能性(這就是我們稱其為base 64的原因)。

只需考慮對數和鴿子洞。 以數字5000為單位,將其存儲在256基中需要多少個位置(鴿子洞,字節)?

"Locations in base256" = ceil(log_2(5000) / 8) = ceil(1.54) = 2

log_2告訴您需要多少位。 現在在base64中有多少?

"Locations in base64" = ceil(log_2(5000) / 6) = ceil(2.04) = 3

暫無
暫無

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

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