2014-10-03 4 views
0

Я Большие base64 закодированный текстовый файл, мне нужно знать, в C# .NetDecode Большой base64 строка в C#

Как декодировать эту большую строку в строку?

Я использую этот код, но это займет много времени, а иногда он замерз и перестает отвечать на запросы

richTextBox2.Text = Base64Decode(richTextBox1.Text); // I Past text at richTextBox1 

и я стараюсь это слишком

var bytes = Convert.FromBase64String(richTextBox1.Text); 
var text = System.Text.Encoding.Unicode.GetString(bytes, 0, bytes.Length); 
richTextBox2.Text = text.ToString(); 

существует много подобных вопросов, но я считаю, нет один разговор о больших текстовых файлов

Edit:

public static string Base64Decode(string base64EncodedData) 
    { 
     var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); 
     return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); 
    } 
+0

Вы пробовали декодировать его async? –

+0

Насколько велика большая и как долго длится? –

+0

Я так не думаю. Можете ли вы объяснить, как? – user3570328

ответ

2

Все 4 байта в базе-64 представляют собой ровно 3 байта исходной полезной нагрузки с нулевым заполнением. Поэтому, если проблема делает все сразу, просто подумайте о нескольких кратных 4 (4 тыс., Например, или 4 * 1024), и обрабатывайте данные в партиях этого количества (или, как бы там ни было осталось, в противном случае).

Однако 1MB не большой объем данных; Я бы не ожидал, что это проблема. Из следующего:

var data = new byte[10000000]; 
    var watch = Stopwatch.StartNew(); 
    string s = Convert.ToBase64String(data); 
    watch.Stop(); 
    Console.WriteLine(watch.ElapsedMilliseconds); 
    watch.Reset(); 
    watch.Start(); 
    byte[] b = Convert.FromBase64String(s); 
    watch.Stop(); 
    Console.WriteLine(watch.ElapsedMilliseconds); 

я получаю 30ms базировать-64 закодировать 10000000 байт, и 50мс базировать 64 Decode строку (длина: 13,333,336 символов).

+0

Спасибо, но я хочу это для (Windows Forms Application) - как я могу заставить его работать? – user3570328

+0

@user конвертирование между базовыми 64 и двоичными работами одинаково независимо от того, где вы находитесь. Задержка, которую вы видите: не из-за конверсии –

+0

спасибо за вашу помощь – user3570328

-3

Используйте BackgroundWorker, чтобы выполнить эту работу.

+0

Использование фонового потока, завернутого в класс Component, не приведет к тому, что один вызов BCL пройдет быстрее, и он не предложит никаких преимущество перед простом вызовом внутри Tas, используя 'async/await' для обновления пользовательского интерфейса после этого. –

+0

Кроме того, проблема не устраняется, если элемент управления RichTextBox задерживает загрузку 1 МБ текста. Это всегда произойдет в потоке пользовательского интерфейса –

+0

Хорошо, он может передать содержимое RichTextBox в строку, а затем отправить эту строку в качестве параметра BackgroundWorker. Я понял, что задержка вызвана декодированием base64, а не I/O с расширенным контролем. – i486