Masalah saat mendekode dokumen dari array byte untuk ditulis ke file

Saya mengambil satu byte[] dari sistem SAP dan mencoba memecahkan kode array kembali ke format file sumber (baik pdf, teks, jpg, atau doc). Namun setelah beberapa kali mencoba, saat membuka file temp yang baru dibuat, konten file adalah nilai yang disandikan (Saya menggunakan file teks untuk pengujian).

Kode yang saya gunakan mengembalikan jalur kembali ke objek yang dibuat, dan metode saya ada di bawah.

private string DecodeFromBytes(byte[] fileContents)
    {
        DocumentFilePath = System.IO.Path.GetTempFileName();
        //FileStream tempFile = File.OpenWrite(DocumentFilePath);

        string bytesString = Convert.ToBase64String(fileContents);
        
        // Used for Checking.
        // This is the exact same as the passed fileContents value. 
        byte[] convertedBytes = Convert.FromBase64String(bytesString);

        MemoryStream ms = new MemoryStream(convertedBytes, 0, convertedBytes.Length);

        ms.Write(convertedBytes, 0, convertedBytes.Length);

        using (FileStream tempFile = new FileStream(DocumentFilePath, FileMode.Create, FileAccess.Write))
        {
            //byte[] tempBytes = new byte[ms.Length];
            //tempFile.Write(convertedBytes, 0, convertedBytes.Length);
            ms.WriteTo(tempFile);
        }
        
        //tempFile.Write(fileContents, 0, fileContents.Length);
        //tempFile.Close();

        return DocumentFilePath;
    }

Teks berkode yang disimpan juga tidak tepat; ada yang mengikuti A. Saya kira sebagai padding pada byte kosong? Di bawah ini adalah apa yang dikembalikan, dan apa yang harus dikembalikan.

Teks yang Disandikan

TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gSW50ZWdlciBuZWMgb2Rpby4gUHJhZXNlbnQgbGliZXJvLiANClNlZCBjdXJzdXMgY W50ZSBkYXBpYnVzIGRpYW0uIFNlZCBuaXNpLiBOdWxsYSBxdWlzIHNlbSBhdCBuaWJoIA0KZWxlbWVudHVtIGltcGVyZGlldC4gRHVpcyBzYWdpdHRpcyBpcHN1bS4gUHJhZXNlbnQgbWF1cmlzLiAN CkZ1c2NlIG5lYyB0ZWxsdXMgc2VkIGF1Z3VlIHNlbXBlciBwb3J0YS4gTWF1cmlzIG1hc3NhLiBWZXN0aWJ1bHVtIGxhY2luaWEgYXJjdSBlZ2V0IG51bGxhLiANCkNsYXNzIGFw dGVudCB0YWNpdGkgc29jaW9zcXUgYWQgbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhIG5vc3RyYSwgDQpwZXIgaW5jZXB0b3MgaGltZW5hZW9zLiBDdXJhYml0dXIgc29kYWxlcyB saWd1bGEgaW4gbGliZXJvLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

File apa yang harus dibaca

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Bilangan bulat tidak diperlukan. Puji libero. Sed cursus ante dapibus diam. Tidak apa-apa. Tidak ada yang namanya unsur imperdiet. Duis sagittis ipsum. Puji mauris. Fusce nec tellus sed augue semper porta. Massa Mauris. Vestibulum lacinia adalah nol. Kelas taciti sosiosqu ad litora torquent yang tepat untuk conubia nostra, per inceptos himenaeos. Curabitur sodales ligula di libero.

Saya yakin saya lupa satu langkah, saya hanya tidak tahu di mana. Bantuan/petunjuk apa pun akan dihargai.

Terima kasih.


person Jake_TheCoder    schedule 02.10.2014    source sumber
comment
Sulit untuk mengetahui mengapa Anda berkonversi ke base64. Mengapa Anda tidak menggunakan File.WriteAllBytes(DocumentFilePath, fileContents) saja?   -  person Jon Skeet    schedule 02.10.2014
comment
Saya mengonversi ke Base64 sehingga pengguna dapat melihat file yang dipilih di aplikasi WPF. menggunakan File.WriteAllBytes(DocumentFilePath, fileContents), saya masih mengembalikan teks yang sama persis seperti yang disandikan di atas.   -  person Jake_TheCoder    schedule 02.10.2014
comment
Tetapi Anda tidak menggunakan versi base64 selain untuk mengonversi kembali ke byte...   -  person Jon Skeet    schedule 02.10.2014
comment
@JonSkeet, Anda benar. Itu sebabnya aku merasa seperti sedang mengejar ekorku! Apa kesalahan saya saat mencoba menulis byte ke file teks yang dapat dibaca?   -  person Jake_TheCoder    schedule 02.10.2014
comment
Jika kode Anda saat ini menuliskan versi yang dikodekan base64, maka sepertinya Anda diteruskan dalam versi yang dikodekan base64.   -  person Jon Skeet    schedule 02.10.2014
comment
@JonSkeet, Anda benar sekali! Saya kembali ke kode sumber SAP saya, dan parameter yang diteruskan menggunakan fungsi code 'SSFC_BASE64_ENCODE'. Itu akan menjelaskan kejar-kejaran ekor.   -  person Jake_TheCoder    schedule 02.10.2014


Jawaban (1)


Karakter 'A' ini sama dengan 0. Sepertinya array fileContents Anda memiliki panjang 510 byte dengan angka nol di belakangnya. Berikut kode yang mereplikasi masalahnya:

var str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. 
Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh 
elementum imperdiet. Duis sagittis ipsum. Praesent mauris. 
Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, 
per inceptos himenaeos. Curabitur sodales ligula in libero.";
// str's length is much lower
var bytes = new byte[510];
Encoding.UTF8.GetBytes(str, 0, str.Length, bytes, 0);
// Value of output is exactly the same as yours
var output = Convert.ToBase64String(bytes);

Namun kode ini akan memberi Anda hasil yang diharapkan:

var str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. 
Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh 
elementum imperdiet. Duis sagittis ipsum. Praesent mauris. 
Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. 
Class aptent taciti sociosqu ad litora torquent per conubia nostra, 
per inceptos himenaeos. Curabitur sodales ligula in libero.";
var bytes = Encoding.UTF8.GetBytes(str);
var output = Convert.ToBase64String(bytes);
person Eldar Dordzhiev    schedule 02.10.2014
comment
Kode Anda memberi saya string Base64 yang benar, dan menghilangkan jalur yang mengganggu tersebut. Sekarang, saya mencoba mencari cara untuk menyimpan byte ke dalam file teks yang dapat dibaca (atau pdf, jika diperlukan). - person Jake_TheCoder; 02.10.2014
comment
@sithlordjake Saya sama sekali tidak yakin dengan apa yang Anda coba lakukan. Metode Anda disebut DecodeFromBytes(), tetapi sebenarnya mengkodekan fileContents ke base64. - person Eldar Dordzhiev; 02.10.2014
comment
Saya yakin saya memiliki visi terowongan. Apa yang saya coba lakukan adalah mengambil byte[] dan menulis byte ke file sementara untuk tujuan tampilan, dan dapat melihatnya dengan benar (yaitu, teks ke teks, gambar ke gambar, pdf ke pdf). Saya menggunakan metode ini untuk membuat URL sementara untuk melihat objek saya. Dua parameter objek lainnya adalah ekstensi file dan judul. - person Jake_TheCoder; 02.10.2014
comment
Ini tampaknya berhasil, menggunakan contoh yang Anda berikan. code FileStream fs = FileStream baru(DocumentFilePath,FileMode.Create, FileAccess.Write, FileShare.None); fs.Write(keluaran, 0, keluaran.Panjang); fs.Tutup(); Saya kira, masalahnya ada pada byte kosong. Tampaknya SAP menambahkan 0 untuk menyusun array. Saya akan mencoba mengulang, atau menyalin array, dan memotong angka nol yang mengganggu. - person Jake_TheCoder; 02.10.2014