2012-02-10 55 views
5

Tôi muốn chuyển đổi tệp nhị phân thành chuỗi có thể được chuyển đổi thành tệp nhị phân. Tôi đã thử điều này:chuyển đổi byte thành chuỗi C#

byte[] byteArray = File.ReadAllBytes(@"D:\pic.png"); 
for (int i = 0; i < byteArray.Length; i++) 
{ 
    textBox1.Text += (char)byteArray[i]; 
} 

nhưng quá chậm, phải mất khoảng 20 giây để chuyển đổi 5KB trên CPU i5. Tôi nhận thấy rằng notepad không giống nhau trong thời gian ít hơn nhiều. Bất kỳ ý tưởng nào về cách thực hiện?

Cảm ơn

Trả lời

15

Nếu bạn muốn để có thể chuyển đổi trở lại nhị phân mà không bị mất bất kỳ thông tin, bạn không nên làm việc này ở tất cả - bạn nên sử dụng mã hóa base64 hay cái gì tương tự:

textBox1.Text = Convert.ToBase64String(byteArray); 

Sau đó, bạn có thể chuyển đổi lại bằng cách sử dụng byte[] data = Convert.FromBase64String(text);. Điều quan trọng là base64 chuyển đổi dữ liệu nhị phân tùy ý thành văn bản ASCII đã biết; tất cả các chuỗi byte là hợp lệ, tất cả đều có thể được khoanh tròn, và vì nó chỉ yêu cầu ASCII nó thân thiện với nhiều phương tiện.

Bốn những điều quan trọng để lấy đi ở đây:

  • Đừng đối xử với dữ liệu nhị phân tùy ý như thể nó là văn bản có giá trị trong một mã hóa đặc biệt. Phil Haack wrote about this in a blog post recently, để trả lời một số câu trả lời SO của tôi.
  • Don't perform string concatenation in a loop; sử dụng StringBuilder nếu bạn muốn tạo một chuỗi cuối cùng trong số rất nhiều bit và bạn không biết số lượng bit trước
  • Không sử dụng thuộc tính giao diện người dùng trong vòng lặp không cần thiết - ngay cả khi các bước trước đó vẫn ổn, nó đã có tốt hơn để xây dựng chuỗi với một vòng lặp và sau đó làm một đơn phân đến Text tài sản
  • Tìm hiểu về System.Text.Encoding cho tình huống mà bạn thực sự đã mã hóa văn bản; Encoding.UTF8.GetString(byteArray) sẽ là thích hợp nếu đây là dữ liệu được mã hóa UTF-8, ví dụ:
+1

Làm thế nào để ToBase64String ngăn chặn việc mất thông tin? –

+0

@Brad: vì sau đó bạn có thể sử dụng 'Convert.FromBase64String' để lấy lại sau ... –

+0

Vì vậy, ý tưởng là sau đó chỉ sử dụng cùng một mã hóa và Base 64 là tổng hợp nhất trong tổng hợp UTF8, 16, v.v. ..? –

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