Intereting Posts

Кодировать FileStream до base64 с помощью c #

Я знаю, как кодировать / декодировать простую строку в / из base64 .

Но как бы я это сделал, если данные уже были записаны в объект FileStream . Допустим, у меня есть только доступ к объекту FileStream, а не к ранее сохраненным исходным данным. Как мне закодировать FileStream на base64, прежде чем я очищу FileStream до файла.

Ofc я мог бы просто открыть свой файл и закодировать / декодировать его после того, как я написал FileStream в файл, но я хотел бы сделать это всего за один шаг, не делая двух файловых операций один за другим. Файл может быть больше, и для загрузки, зашифрования и сохранения его снова потребуется два раза, после того, как он был сохранен за короткое время раньше.

Может быть, кто-то из вас знает лучшее решение? Могу ли я преобразовать FileStream в строку, закодировать строку и затем преобразовать строку обратно в FileStream, например, или что бы я сделал и как выглядел бы такой код?

Вы также можете кодировать байты в Base64. Как получить это из streamа, см. Здесь: Как преобразовать stream в байт [] в C #?

Или я думаю, что также следует использовать метод .ToString () и кодировать это.

Вы можете попробовать что-то вроде этого:

public Stream ConvertToBase64(Stream stream) { Byte[] inArray = new Byte[(int)stream.Length]; Char[] outArray = new Char[(int)(stream.Length * 1.34)]; stream.Read(inArray, 0, (int)stream.Length); Convert.ToBase64CharArray(inArray, 0, inArray.Length, outArray, 0); return new MemoryStream(Encoding.UTF8.GetBytes(outArray)); } 

Легкий как метод расширения

 public static class Extensions { public static Stream ConvertToBase64(this Stream stream) { byte[] bytes; using (var memoryStream = new MemoryStream()) { stream.CopyTo(memoryStream); bytes = memoryStream.ToArray(); } string base64 = Convert.ToBase64String(bytes); return new MemoryStream(Encoding.UTF8.GetBytes(base64)); } } 

Поскольку файл будет больше, у вас нет большого выбора в том, как это сделать. Вы не можете обработать файл на месте, так как это уничтожит информацию, которую вам нужно использовать. У меня есть два варианта:

  1. Читайте во всем файле, base64 закодируйте, перепишите закодированные данные.
  2. Прочитайте файл в меньших частях, кодируя, как вы идете. Кодировать во временный файл в том же каталоге. Когда вы закончите, удалите исходный файл и переименуйте временный файл.

Конечно, весь смысл streamов – избежать такого сценария. Вместо того, чтобы создавать контент и набивать его в stream файлов, залейте его в stream памяти. Затем закодируйте это и только затем сохраните на диск.

Не забудь:

 stream.Seek(0, SeekOrigin.Begin); 

в начале метода … 😉