Преобразование файла в Base64String и обратно

109

Название говорит само за себя:

  1. Читал в архиве tar.gz вот так
  2. разбить файл на массив байтов
  3. Преобразуйте эти байты в строку Base64
  4. Преобразуйте эту строку Base64 обратно в массив байтов
  5. Запишите эти байты обратно в новый файл tar.gz

Я могу подтвердить, что оба файла имеют одинаковый размер (метод ниже возвращает true), но я больше не могу извлекать копию копии.

Я что-то упускаю?

Boolean MyMethod(){
    using (StreamReader sr = new StreamReader("C:\...\file.tar.gz")) {
        String AsString = sr.ReadToEnd();
        byte[] AsBytes = new byte[AsString.Length];
        Buffer.BlockCopy(AsString.ToCharArray(), 0, AsBytes, 0, AsBytes.Length);
        String AsBase64String = Convert.ToBase64String(AsBytes);

        byte[] tempBytes = Convert.FromBase64String(AsBase64String);
        File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);
    }
    FileInfo orig = new FileInfo("C:\...\file.tar.gz");
    FileInfo copy = new FileInfo("C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

РЕДАКТИРОВАТЬ: рабочий пример намного проще (благодаря @TS):

Boolean MyMethod(){
    byte[] AsBytes = File.ReadAllBytes(@"C:\...\file.tar.gz");
    String AsBase64String = Convert.ToBase64String(AsBytes);

    byte[] tempBytes = Convert.FromBase64String(AsBase64String);
    File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);

    FileInfo orig = new FileInfo(@"C:\...\file.tar.gz");
    FileInfo copy = new FileInfo(@"C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

Спасибо!

darkpbj
источник
Вы не можете просто так изменить содержимое сжатого файла. Вам нужно будет распаковать файл на шаге 1, а не просто читать его как есть. И затем на шаге 5 также нужно будет повторно сжать данные, а не просто записывать байты напрямую.
itsme86
К счастью, поскольку не было никаких реальных манипуляций с самим файлом (в основном, просто перемещение его из точки A в B), эта конкретная задача не требует какого-либо (де /) сжатия
darkpbj

Ответы:

292

Если вы по какой-то причине хотите преобразовать ваш файл в строку base-64. Например, если вы хотите передать его через Интернет и т. Д., Вы можете сделать это

Byte[] bytes = File.ReadAllBytes("path");
String file = Convert.ToBase64String(bytes);

И, соответственно, читать обратно в файл:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
TS
источник
Спасибо за информацию, я попытался согласиться с приведенным ниже ответом, но это не помогло, но, похоже, это решило мою проблему с помощью простого openFileDialog
Mister SirCode
Что, если ToBase64String вернет System.OutOfMemoryException? Как вы оптимизируете для больших файлов и ограниченной памяти
Олорунфеми Аджибулу
@OlorunfemiAjibulu, тогда я подозреваю, что вам нужно будет использовать потоки. Или разбить струну на части. Однажды я написал специальное шифрование для больших файлов, куда мы сохранили зашифрованные фрагменты. Мы добавили 4 байта, чтобы сохранить целочисленное значение для размера блока. Таким образом, мы знали, что нужно читать так много позиций
TS
Интересный @TaylorSpark. Я использовал стримы, и все было в порядке.
Олорунфеми Аджибулу
3
private String encodeFileToBase64Binary(File file){    
String encodedfile = null;  
try {  
    FileInputStream fileInputStreamReader = new FileInputStream(file);  
    byte[] bytes = new byte[(int)file.length()];
    fileInputStreamReader.read(bytes);  
    encodedfile = Base64.encodeBase64(bytes).toString();  
} catch (FileNotFoundException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
} catch (IOException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
}  
    return encodedfile;  
}
Хитеш Кумар
источник
3
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа. Чтобы получить качественный ответ, прочтите эту инструкцию .
thewaywewere
1
зачем опять же он нужен, javaесли OP использует c#?
TS
@TS зачем, опять же, java?
Нажмите Ok,