一个Base-64字符数组的长度无效。

8

我在IF(){...}中遇到了"Invalid length for a Base-64 char array."的错误提示,这是我尝试让它正常工作的变化。第一行就失败了,没有调用decrypt(...)函数,证明不是那个函数的问题。第一个decrypt(...)调用也会出现同样的错误。最后一个使用encoding.ascii...的调用可以让我进入函数,但在函数内部仍然失败。从数据库中获取的加密信息被转换为字符串SSnum,其值为:4+mFeTp3tPF。

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方法...那么为什么它会失败,我该如何修复它?


3
请不要在标题中加入诸如“c#”之类的内容,这是标签的作用。 - John Saunders
4+mFeTp3tPF 不是有效的 base64 值。它包含 11 个字符,而 base64 值长度应该是 4 的倍数。使用填充后,它应该看起来像 4+mFeTp3tPF=(其中 = 用于填充)。您应该检查 base64 值的生成方式。 - Alek Davis
5个回答

24

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); 

这个链接

这会对你有所帮助,试一下。 感谢 suribabu。


15

它的值为:4+mFeTp3tPF

您之所以收到此错误,是因为该值“4+mFeTp3tPF”实际上不是有效的Base64格式。

您是否可能只是缺少必需的填充字符,如下所示:4+mFeTp3tPF=


在SQL数据库中,它是一个varchar(11),所以任何“=”都会被截断...这也解释了为什么有时候我看到那么多等号!我在某个地方看到过它是4的倍数?所以把我的varchar(11)改成varchar(12)或更多就可以解决问题了,对吧? - dave k
是的,如果您的数据库正在截断,则需要将字段长度加长。长度不足没有任何意义。如果它是varchar类型,则varchar(12)和varchar(255)之间大小没有区别(在MSSQL上,一直到varchar(4000))。这是因为该字段包含一个指定文本长度的整数,而不是阻止11或12或4000个字符。请参见维基百科的Base64规范:http://en.wikipedia.org/wiki/Base64 - quentin-starin

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字符串吗? 我尝试了一些在线服务,但没有一个能够转换它。

一个等号是没有意义的 - 请尝试使用http://base64.ru/ 或 http://home1.paulschou.net/tools/xlate/ 或 http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/。我猜测在向数据库提交数据的过程中发生了一些错误。 - Alex Zhevzhik

-1

替换

byte[] temp = Convert.FromBase64String(SSnum);

为以下内容

var temp = UTF8Encoding.UTF8.GetBytes(SSnum);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接