Могу ли я загрузить uri данных без необходимости делать все это самостоятельно?

Возможно, класс с именем WebClient не обязан превращать uri данных в byte[], но я попытался

var client = new WebClient();
var result = client.DownloadData(uri);

учитывая uri, похожий на

data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

и получил сообщение WebException

Префикс URI не распознан.

Как мне проще всего декодировать uri данных?

Проблема с декодированием такого uri с

Convert.FromBase64String(str) заключается в том, что мне нужно извлечь часть

R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

во-первых, что, конечно, является тривиальной задачей.

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

Нужно ли мне самому выполнять декодирование base64, если я не хочу этого дополнительного распределения?


person Anders Lindén    schedule 08.11.2016    source источник
comment
base64, как известно, не подходит для хранения больших объемов данных. кстати, если у вас уже есть строка в кодировке base64, зачем вам сначала передавать ее через WebClient?   -  person Timothy Groote    schedule 08.11.2016
comment
Я надеялся преобразовать его WebClient.   -  person Anders Lindén    schedule 08.11.2016


Ответы (1)


afaik, вы можете преобразовать только часть строки, используя определенный базовый класс Encoding. (в отличие от преобразования всего за один раз)

если вы имеете дело с веб-вещами, я думаю, вам нужна UTF8

что-то среди этих строк: (этот пример не делает точно то, что вы хотите сделать)

string completeMessage = "";
int byteStepSize = 4;

for(int i=0; i < byteStepSize; i+= byteStepSize)
{
    string subStr = str.SubString(i, i+byteStepSize);
    completeMessage += encoding.UTF8.GetString(Convert.FromBase64String(subStr));
}

Таким образом, вы могли бы (теоретически) выполнять потоковую передачу через строку, закодированную в base64, избегая необходимости полностью выделять ее за один раз.

person Timothy Groote    schedule 08.11.2016
comment
Проблема в том, что я не могу/не хочу создавать дополнительную подстроку, если файл большой. - person Anders Lindén; 08.11.2016
comment
ну, идея этой настройки заключается в том, что вы можете использовать цикл, чтобы уменьшить выделение подстроки / объем памяти. - person Timothy Groote; 08.11.2016
comment
Для преобразования из произвольных байтов в base 64 вы можете работать с 3 байтами за раз. Поскольку каждые 3 входных байта дают 4 выходных символа. Что должно сказать вам, что работать с тремя символами за раз, конвертируя в другом направлении, не безопасно. (Однако вы можете работать с 4 персонажами одновременно) - person Damien_The_Unbeliever; 08.11.2016