Chuyển đổi tệp thành Base64String và quay lại một lần nữa


108

Tiêu đề nói lên tất cả:

  1. Tôi đã đọc trong kho lưu trữ tar.gz như vậy
  2. ngắt tệp thành một mảng byte
  3. Chuyển những byte đó thành chuỗi Base64
  4. Chuyển đổi chuỗi Base64 đó trở lại thành một mảng byte
  5. Ghi lại các byte đó vào tệp tar.gz mới

Tôi có thể xác nhận rằng cả hai tệp đều có cùng kích thước (phương pháp bên dưới trả về true) nhưng tôi không thể giải nén phiên bản sao chép được nữa.

Tui bỏ lỡ điều gì vậy?

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

CHỈNH SỬA: Ví dụ làm việc đơn giản hơn nhiều (Cảm ơn @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);
}

Cảm ơn!


Bạn không thể chỉ thay đổi nội dung của một tệp nén như vậy. Bạn sẽ phải giải nén tệp ở bước 1 thay vì chỉ đọc trực tiếp như hiện tại. Và sau đó, bước 5 cũng sẽ phải nén lại dữ liệu thay vì chỉ ghi ra các byte trực tiếp.
itme86,

May mắn thay, vì không có thao tác thực tế của các tập tin bản thân (về cơ bản chỉ cần di chuyển nó từ điểm A đến B) Nhiệm vụ đặc biệt này không đòi hỏi bất kỳ (de /) nén
darkpbj

Câu trả lời:


288

Nếu bạn muốn vì lý do nào đó để chuyển đổi tệp của mình thành chuỗi base-64. Giống như nếu bạn muốn chuyển nó qua internet, vv ... bạn có thể làm điều này

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

Và tương ứng, hãy đọc lại tệp:

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

Thankyou cho các thông tin, tôi đã cố gắng đi cùng với câu trả lời dưới đây, nhưng nó giúp didnt, nhưng điều này dường như để giải quyết vấn đề của tôi với một đơn giản OpenFileDialog
Mister SirCode

Điều gì sẽ xảy ra nếu ToBase64String trả về System.OutOfMemoryException? Làm thế nào để bạn tối ưu hóa cho các tập tin lớn và bộ nhớ hạn chế
Olorunfemi Ajibulu

@OlorunfemiAjibulu thì tôi nghi ngờ, bạn sẽ cần sử dụng luồng. Hoặc ngắt chuỗi thành nhiều phần. Một lần tôi đã viết mã hóa tùy chỉnh cho các tệp lớn nơi chúng tôi lưu các phần được mã hóa. Chúng tôi đã thêm 4 byte để lưu giá trị số nguyên cho kích thước chunk. Bằng cách này, chúng ta biết để đọc rất nhiều vị trí
TS

@TaylorSpark thú vị. Tôi đã sử dụng các luồng và tôi vẫn ổn.
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
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh về cách và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời. Vui lòng đọc cách trả lời này để cung cấp câu trả lời chất lượng.
thewaywewere

1
Tại sao, một lần nữa, chúng ta cần javanếu OP sử dụng c#?
TS

@ T tại sao, một lần nữa, chúng ta có cần java không?
Nhấp vào Ok
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.