Перетворення файлу в Base64String та назад


108

У заголовку все сказано:

  1. Я читаю в архіві tar.gz так
  2. розбити файл на масив байтів
  3. Перетворити ці байти в рядок Base64
  4. Перетворіть цей рядок Base64 назад у масив байтів
  5. Запишіть ці байти назад у новий файл tar.gz

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

Я щось пропускаю?

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

EDIT: Робочий приклад набагато простіший (Завдяки @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);
}

Дякую!


Ви не можете просто змінити вміст такого стисненого файлу. Вам доведеться розпакувати файл на кроці 1, а не просто прочитати його безпосередньо так, як є. І тоді на кроці 5 також доведеться перекомпонувати дані, а не просто виписувати байти безпосередньо.
— itsme86

На щастя, оскільки не було фактичного маніпулювання самим файлом (в основному просто переміщенням його з точки А до В), ця конкретна задача не вимагає ніякого (де /) стиснення
— darkpbj

Відповіді:


289

Якщо ви хочете з якоїсь причини перетворити файл у рядок base-64. Начебто, якщо ви хочете передати його через Інтернет тощо ... ви можете це зробити

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

І відповідно, прочитайте назад до файлу:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);

Дякую за інформацію, я спробував пройти разом з відповіддю нижче, але це не допомогло, але це, здавалося, вирішило мою проблему за допомогою простого openFileDialog
— Mister SirCode

Що робити, якщо ToBase64String повертає System.OutOfMemoryException? Як оптимізувати великі файли та обмежену пам’ять
— Olorunfemi Ajibulu

@OlorunfemiAjibulu, тоді я підозрюю, вам потрібно буде використовувати потоки. Або розбити рядок на частини. Одного разу я написав спеціальне шифрування для великих файлів, де ми зберегли зашифровані фрагменти. Ми додали 4 байти, щоб зберегти ціле значення для розміру шматка. Таким чином ми вміли читати стільки позицій
— TS

Цікавий @TaylorSpark. Я використовував потоки і мені було добре.
— Olorunfemi Ajibulu

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якщо ОП використовує c#?
— TS

@TS чому, знову ж таки, нам потрібна Java?
— Клацніть Ок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.