Недопустимая длина для массива Base-64 char - PullRequest
5 голосов
/ 01 февраля 2011

Я получаю «Недопустимая длина для массива Base-64 char». внутри IF () {...} есть варианты, которые я пытался заставить его работать. в первой строке происходит сбой без вызова decrypt (...), доказывая, что проблема не в этих функциях. я получаю ту же ошибку внутри с первым вызовом decrypt (...). последний, использующий кодировку encasc.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 ... так почему он не работает, как я могу это исправить?

Ответы [ 5 ]

18 голосов
/ 19 февраля 2013

Длина данных Base64 должна быть кратна 4 и с отступом char '=' Вы можете изменить свои данные на действительные данные 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.

13 голосов
/ 01 февраля 2011

это значение: 4 + mFeTp3tPF

Вы получаете эту ошибку, потому что это значение, 4+mFeTp3tPF, фактически не действительное Base64.

Возможно, вы просто пропускаете требуемый символ заполнения, как, например, 4+mFeTp3tPF=?

1 голос
/ 01 февраля 2011

Вы уверены, что у вас есть строка Base64? Base64 - это средство кодирования двоичных данных в строку с использованием только стандартных 7-битных символов ASCII. Это , а не строковая кодировка, подобная ASCII, с некоторыми управляющими байтами. У вас есть строка Base64, если вы используете Convert.ToBase64String для получения значения (которое, если вы пытаетесь сохранить двоичные данные в виде строки, будет лучшим выбором)

Судя по вашей ошибке (и вашим примерным данным), я предполагаю, что у вас нет строки Base64. Если вам необходимо сохранить двоичные данные в базе данных, вы можете создать столбец с использованием двоичного типа или зашифровать строку в Base64 с помощью Convert.ToBase64String.

byte[] inputData = ...;

string base64String = Convert.ToBase64String(inputData);

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

Здесь outputData должен содержать те же данные, что и inputData.

Если то, что у вас есть, это просто строка в кодировке ASCII, то ваша первоначальная практика использования System.Text.Encoding.ASCII.GetBytes() верна, но вы должны изменить это на использование строки Base64, если можете.

0 голосов
/ 25 января 2017

заменить

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

в

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

0 голосов
/ 01 февраля 2011

Вы уверены, что строка 4 + mFeTp3tPF является правильно сформированной строкой Base64? Я пробовал некоторые онлайн-сервисы - никто не мог конвертировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...