การแปลงไฟล์เป็น Base64String และกลับมาอีกครั้ง


109

ชื่อบอกทุกอย่าง:

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

แก้ไข: ตัวอย่างการทำงานนั้นง่ายกว่ามาก (ขอบคุณ @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

โชคดีที่ไม่มีการจัดการไฟล์อย่างแท้จริง (โดยพื้นฐานแล้วเพียงแค่ย้ายจากจุด A ไป B) งานเฉพาะนี้ไม่ต้องการการบีบอัด (de /) ใด ๆ
darkpbj

คำตอบ:


294

หากคุณต้องการเหตุผลบางประการในการแปลงไฟล์ของคุณเป็นสตริงฐาน 64 เช่นถ้าคุณต้องการส่งผ่านอินเทอร์เน็ต ฯลฯ ... คุณสามารถทำได้

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

และตามลำดับอ่านกลับไปที่ไฟล์:

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

1
ขอบคุณสำหรับข้อมูลฉันพยายามทำตามคำตอบด้านล่าง แต่มันไม่ได้ช่วย แต่ดูเหมือนว่าจะแก้ปัญหาของฉันด้วย 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ถ้า OP ใช้c#?
TS

@TS ทำไมเราต้องใช้ java อีกครั้ง?
คลิกตกลง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.