2011-02-01 55 views
3

我得到「Base-64字符數組的無效長度」。 IF(){...}內部是我試圖讓它工作的變體。它在沒有調用解密(...)的情況下在第一行失敗,證明這不是功能問題。我在第一次解密(...)調用時遇到同樣的錯誤。最後一個使用encoding.ascii ...會讓我進入函數,但是它在函數內部失敗。我正在從數據庫中獲取正確的加密信息來將字符串SSnum。它的值是:4 + mFeTp3tPFBase-64字符數組的長度無效

try 
{ 
    string SSnum = dr.GetString(dr.GetOrdinal("Social Security")); 
    if (isEncrypted) 
    { 
     byte[] temp = Convert.FromBase64String(SSnum); 
     //SSnum = decrypt(Convert.FromBase64String(SSnum), Key, IV); 
     //SSnum = decrypt(Encoding.ASCII.GetBytes(SSnum), Key, IV); 
    } 
    txt_Social_Security.Text = SSnum; 
} 
catch { txt_Social_Security.Text = ""; } 

有人告訴我使用Convert.FromBase64String(),而不是ASCII方法......那麼,爲什麼失敗,我該怎麼解決?

+2

請不要在標題中加入類似「c#」的內容。這就是標籤的用途。 – 2011-02-01 19:47:05

+0

4 + mFeTp3tPF看起來不像一個有效的base64值。它包含11個字符,而base64值長度應該是4的倍數。使用填充,它應該看起來像4 + mFeTp3tPF =(其中=用於填充)。你應該檢查base64值是如何生成的。 – 2011-02-01 19:53:27

回答

10

它的值是:4 + mFeTp3tPF

您收到此錯誤,因爲該值,4+mFeTp3tPF,其實有效的Base64。

是否有可能您只是缺少所需的填充字符,因此4+mFeTp3tPF=

+0

這將是有道理的,在SQL數據庫中它是一個varchar(11),所以任何'='將被截斷...這也解釋了爲什麼我有時見過這麼多等號!我看到某處它是4的倍數?所以使我的varchar(11)varchar(12)..或更多將是修復,對不對? – 2011-02-01 20:03:03

+0

是的,如果您的數據庫正在截斷,您需要延長該字段。長度上也沒有一點吝嗇。如果它是varchar,那麼varchar(12)和varchar(255)(在MSSQL上一直到varchar(4000))之間的大小沒有區別,這是因爲該字段包含一個指定文本長度的整數,而不是阻止11或12或4000個字符。請參閱維基百科的Base64規範:http://en.wikipedia.org/wiki/Base64 – 2011-02-01 20:05:21

1

你確定你有一個Base64字符串嗎? Base64是一種將二進制數據編碼爲字符串的方法,同時僅使用標準的7位ASCII字符。這是而不是像ASCII一樣的字符串編碼,並且存在一些控制字節。如果你使用Convert.ToBase64String來獲得數值(如果你想把二進制數據存儲爲一個字符串,這是你最好的選擇),你有一個Base64字符串。

根據你的錯誤(和你的例子數據) ,我假設你做不是有一個Base64字符串。如果您需要將二進制數據存儲在數據庫中,則可以使用二進制類型創建列,或使用Convert.ToBase64String將字符串編碼爲Base64。

byte[] inputData = ...; 

string base64String = Convert.ToBase64String(inputData); 

byte[] outputData = Convert.FromBase64String(base64String); 

這裏,outputData應包含相同的數據爲inputData

如果你有什麼只是一個ASCII編碼的字符串,那麼你原來的做法是使用System.Text.Encoding.ASCII.GetBytes()是正確的,但你應該改變這個使用Base64字符串,如果可以的話。

0

確定字符串4 + mFeTp3tPF是合格的Base64字符串嗎? 我試過一些在線服務 - 沒有人可以將其轉換。

+0

一個平等的唱歌是無意義的 - 嘗試http://base64.ru/或http: //home1.paulschou.net/tools/xlate/或http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/。我想在向數據庫提交數據時發生了一些錯誤。 – 2011-02-01 20:51:09

14

Base64數據長度應該是4的倍數並且使用填充字符'=' 您可以將數據更改爲有效的base64數據。

string dummyData = imgData.Trim().Replace(" ", "+"); 
if (dummyData.Length % 4 > 0) 
dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '='); 
byte[] byteArray = Convert.FromBase64String(dummyData); 

https://stackoverflow.com/a/9301545/2024022

這將幫助你,嘗試一次。 謝謝 suribabu。

0

取代

字節[]溫度=轉換。FromBase64String(SSnum);

變種臨時= UTF8Encoding.UTF8.GetBytes(SSnum);

相關問題