Недопустимая длина для массива символов Base-64.

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


person dave k    schedule 01.02.2011    source источник
comment
пожалуйста, не помещайте в заголовок такие вещи, как C #. Вот для чего нужны теги.   -  person John Saunders    schedule 01.02.2011
comment
4 + mFeTp3tPF не похоже на допустимое значение base64. Он содержит 11 символов, а длина значений base64 должна быть кратна 4. С заполнением он должен выглядеть как 4 + mFeTp3tPF = (где = используется для заполнения). Вы должны проверить, как генерируется значение base64.   -  person Alek Davis    schedule 01.02.2011


Ответы (5)


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

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

Возможно ли, что вам просто не хватает необходимого символа заполнения, так 4+mFeTp3tPF=?

person quentin-starin    schedule 01.02.2011
comment
это имело бы смысл, в базе данных sql это varchar (11), поэтому любой знак '=' будет усечен ... и это также объясняет, почему я иногда видел так много знаков равенства! я где-то видел, что это кратно 4? так что сделай мой varchar (11) до varchar (12) .. или больше будет исправлением, не так ли? - person dave k; 01.02.2011
comment
Да, если ваша БД усекается, вам нужно сделать поле длиннее. Нет смысла экономить на длине. Если это varchar, нет разницы в размере между varchar (12) и varchar (255) (а в MSSQL, вплоть до varchar (4000)). Это связано с тем, что поле содержит целое число, определяющее длину текста. вместо блокировки 11, 12 или 4000 символов. См. спецификацию Base64 в википедии: en.wikipedia.org/ вики / Base64 - person quentin-starin; 01.02.2011

Длина данных 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

Это вам поможет, попробуйте один раз. Спасибо, Сурибабу.

person surbob    schedule 19.02.2013
comment
Ты спас мне день :) - person Chen; 20.06.2017

Вы уверены, что у вас есть строка 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, если можете.

person Adam Robinson    schedule 01.02.2011

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

person Alex Zhevzhik    schedule 01.02.2011
comment
Одно равное пение бессмысленно - попробуйте base64.ru или home1.paulschou.net/tools/xlate или impressionatedgeek.com/dotnet/tools/Base64Decode. Я предполагаю, что при отправке данных в базу данных произошла какая-то ошибка. - person Alex Zhevzhik; 01.02.2011

заменять

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

к этому

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

person Dmitry Zgursky    schedule 25.01.2017