Перетворення файлу в 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.