Невозможно декодировать base64 при чтении данных с консоли C# - PullRequest
0 голосов
/ 29 мая 2020

Я столкнулся с проблемой при преобразовании кодирования / декодирования данных с помощью C#. Я жестко закодировал определенные (закодированные) данные base64 и успешно декодировал строку. Как показано ниже,

string encodedText = "eyJDb25uX0dyb3VwX0lEIjozMywiVXNlckVtYWlsIjoiVGVzdHNlcnZpc2VA\nZ21haWwuY29tIiwiVXNlclBhc3N3b3JkIjoib1ZkTEREWUVfX3FuSnZFSE1W\ncnR5WU5ZZzJSTnNzUnpaWG5KaFJMcCIsIkJhc2VVUkwiOiJodHRwOi8vbG9j\nYWxob3N0OjMwMDAifQ==\n";
byte[] data = Convert.FromBase64String(encodedText);
string decodedString = Encoding.UTF8.GetString(data);

Но при чтении того же значения с консоли не удалось декодировать данные. Например,

string readLine = Console.ReadLine();
Console.WriteLine("Received Data :: " + readLine); // Exactly same data received here
byte[] encodedByte = Convert.FromBase64String(readLine); //Failed here?
string configData = System.Text.Encoding.UTF8.GetString(encodedByte);

Второй код завершился ошибкой с сообщением об ошибке ниже

Unhandled exception. System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
   at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
   at System.Convert.FromBase64String(String s)

Примечание:

Я заметил это и удалил все \ n из данная строка. Теперь все работает нормально. Но я не знаю, как это \ n удалить программно. Я пробовал использовать приведенные ниже коды, но он не работает,

readLine = Regex.Replace(readLine, @"\t|\n|\r", String.Empty);

А также пробовал:

readLine = readLine.Replace("\n", String.Empty);

Было бы очень признательно, если бы кто-нибудь помог в этом.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Проблема, почему это не должно работать, потому что, когда строка вводится в командную строку, '\ n' будет экранирован до '\\ n' Попробуйте это:

readLine = readLine.Replace("\\n", "");
//or
readLine = Regex.Replace(readLine, @"\\t|\\n|\\r", String.Empty);
1 голос
/ 29 мая 2020

Вот оригинал, переписанный, чтобы проиллюстрировать дополнительные символы:

string encodedText = 
    "eyJDb25uX0dyb3VwX0lEIjozMywiVXNlckVtYWlsIjoiVGVzdHNlcnZpc2VA"
+ "\nZ21haWwuY29tIiwiVXNlclBhc3N3b3JkIjoib1ZkTEREWUVfX3FuSnZFSE1W"
+ "\ncnR5WU5ZZzJSTnNzUnpaWG5KaFJMcCIsIkJhc2VVUkwiOiJodHRwOi8vbG9j"
+ "\nYWxob3N0OjMwMDAifQ=="
+ "\n";

В консоли должны быть введены следующие данные:

eyJDb25uX0dyb3VwX0lEIjozMywiVXNlckVtYWlsIjoiVGVzdHNlcnZpc2VAZ21haWwuY29tIiwiVXNlclBhc3N3b3JkIjoib1ZkTEREWUVfX3FuSnZFSE1WcnR5WU5ZZzJSTnNzUnpaWG5KaFJMcCIsIkJhc2VVUkwiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAifQ==

Нет проблем с кодировкой этих данных "после очистки", и они будут правильно прочитаны с помощью Console.ReadLine, если они введены правильно. Попробуйте передать его из файла, если не удается вставить его правильно.

Код из литерала работает из-за ослабленных правил, в которых символы новой строки игнорируются Convert.FromBase64String. Однако перевод ("\ n" в буквальную новую строку), который встречается в строковом литерале, НЕ происходит при вводе / чтении через консоль.

Выполнение перевода ошибочных \n последовательностей, которые появляются - читать как два символа при вводе в консоли - потребуется код, например:

readLine = readLine.Replace("\\n", "");
// "\n".ToCharArray()  -> { 0x10 }
// "\\n".ToCharArray() -> { '\\', 'n' }
...