从控制台C#读取数据时无法解码base64

问题描述 投票:0回答:2

我在使用C#转换编码/解码数据时遇到了问题。我已经硬编码了某些base64(encoded)数据,并成功地解码了字符串。如下所示,

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

如果有人对此提供帮助,将不胜感激。

c# encoding utf-8 base64 decode
2个回答
0
投票

为什么它不起作用的问题,因为当将字符串输入到命令行'\ n'时会转义为'\\ n'试试这个:

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

0
投票

这里是原始文字,用以说明其他字符:

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

然后应在控制台中输入的数据是:

eyJDb25uX0dyb3VwX0lEIjozMywiVXNlckVtYWlsIjoiVGVzdHNlcnZpc2VAZ21haWwuY29tIiwiVXNlclBhc3N3b3JkIjoib1ZkTEREWUVfX3FuSnZFSE1WcnR5WU5ZZzJSTnNzUnpaWG5KaFJMcCIsIkJhc2VVUkwiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAifQ==

“清理时”,此数据不存在编码问题,如果正确输入,将可以用Console.ReadLine正确读取。如果无法正确粘贴,请尝试从文件中将其插入。

文字中的代码之所以有效,是因为放宽了规则,因为Convert.FromBase64String会忽略换行符。但是,通过控制台输入/读取时,不会发生字符串文字中的(从“ \ n”到文字换行符的转换)。

对出现的错误\n序列进行翻译-在控制台中键入时读为两个字符-将需要如下代码:

readLine = readLine.Replace("\\n", "");
// "\n".ToCharArray()  -> { 0x10 }
// "\\n".ToCharArray() -> { '\\', 'n' }
© www.soinside.com 2019 - 2024. All rights reserved.