2010-06-05 44 views
6

tôi đang cố gắng để đọc một tập tin nhị phân (ví dụ một file thực thi) vào một chuỗi, sau đó viết nó trở lạitập tin nhị phân để chuỗi

FileStream fs = new FileStream("C:\\tvin.exe", FileMode.Open); 
BinaryReader br = new BinaryReader(fs); 
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length)); 
System.Text.Encoding enc = System.Text.Encoding.ASCII; 
string myString = enc.GetString(bin); 
fs.Close(); 
br.Close(); 
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
byte[] rebin = encoding.GetBytes(myString); 
FileStream fs2 = new FileStream("C:\\tvout.exe", FileMode.Create); 
BinaryWriter bw = new BinaryWriter(fs2); 
bw.Write(rebin); 
fs2.Close(); 
bw.Close(); 

này không làm việc (kết quả có chính xác cùng kích thước trong byte nhưng không thể chạy)

nếu tôi làm bw.Write (bin) kết quả là ok, nhưng tôi phải lưu nó vào một chuỗi

+0

Thực hiện so sánh hex, là các byte theo thứ tự ngược lại? (ít endian để lớn endian) – Amirshk

+0

Tại sao bạn cần phải lưu trữ nó như là một chuỗi? –

Trả lời

15

Khi bạn giải mã byte thành chuỗi và mã hóa lại thành byte, bạn sẽ mất thông tin. ASCII nói riêng là một lựa chọn rất xấu vì ASCII sẽ ném rất nhiều thông tin trên đường, nhưng bạn có nguy cơ mất thông tin khi mã hóa và giải mã bất kể loại Mã hóa bạn chọn, vì vậy bạn không đi đúng hướng .

Những gì bạn cần là một trong những thói quen BaseXX, mã hóa dữ liệu nhị phân thành ký tự in được, thường để lưu trữ hoặc truyền qua một môi trường mà chỉ cho phép văn bản (email và usenet nói đến cái tâm.)

Ascii85 là một thuật toán như vậy và trang chứa các liên kết đến các triển khai khác nhau. Nó có tỷ lệ 4: 5 có nghĩa là 4 byte sẽ được mã hóa dưới dạng 5 ký tự (tăng 25% về kích thước.)

Nếu không có gì khác, đã có quy trình mã hóa Base64 được tích hợp vào .NET. Nó có một tỷ lệ 3: 4 (tăng 33% trong kích thước), ở đây:

Đây là những gì mã của bạn có thể trông giống như với các phương pháp:

string myString; 
using (FileStream fs = new FileStream("C:\\tvin.exe", FileMode.Open)) 
using (BinaryReader br = new BinaryReader(fs)) 
{ 
    byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length)); 
    myString = Convert.ToBase64String(bin); 
} 

byte[] rebin = Convert.FromBase64String(myString); 
using (FileStream fs2 = new FileStream("C:\\tvout.exe", FileMode.Create)) 
using (BinaryWriter bw = new BinaryWriter(fs2)) 
    bw.Write(rebin); 
2

tôi không nghĩ rằng bạn có thể đại diện cho tất cả các byte với ASCII trong theo cách đó. Base64 là một thay thế, nhưng với một tỷ lệ giữa byte và văn bản 3: 4.

Các vấn đề liên quan