(Trong .NET) Tôi có dữ liệu nhị phân tùy ý được lưu trữ trong một byte [] (ví dụ như một hình ảnh). Bây giờ, tôi cần lưu trữ dữ liệu đó trong một chuỗi (trường "Nhận xét" của một API cũ). Có kỹ thuật tiêu chuẩn cho đóng gói dữ liệu nhị phân này vào một chuỗi không? Bằng cách "đóng gói" tôi có nghĩa là đối với bất kỳ tập hợp dữ liệu lớn và ngẫu nhiên hợp lý nào, bytes.Length/2 tương tự như được đóng gói.Length; bởi vì hai byte là nhiều hơn hoặc ít hơn một ký tự đơn.Có một kỹ thuật tiêu chuẩn để đóng gói dữ liệu nhị phân vào một chuỗi UTF-16 không?
Hai "rõ ràng" câu trả lời không thỏa mãn tất cả các tiêu chí:
string base64 = System.Convert.ToBase64String(bytes)
không thể sử dụng rất hiệu quả trong những chuỗi vì nó chỉ sử dụng 64 ký tự ra khỏi khoảng 60.000 sẵn (của tôi bộ nhớ là System.String). Đi với
string utf16 = System.Text.Encoding.Unicode.GetString(bytes)
tận dụng tốt hơn về chuỗi, nhưng nó sẽ không làm việc cho dữ liệu có chứa các ký tự Unicode không hợp lệ (nói cặp thay thế mis-phù hợp). This MSDN article cho thấy kỹ thuật chính xác (kém) này.
Hãy xem xét một ví dụ đơn giản:
byte[] bytes = new byte[] { 0x41, 0x00, 0x31, 0x00};
string utf16 = System.Text.Encoding.Unicode.GetString(bytes);
byte[] utf16_bytes = System.Text.Encoding.Unicode.GetBytes(utf16);
Trong trường hợp này byte và utf16_bytes đều giống nhau, bởi vì gốc byte là một chuỗi UTF-16. Thực hiện thủ tục tương tự với mã hóa base64 này cung cấp mảng base64_bytes 16 thành viên.
Bây giờ, lặp lại các thủ tục với không hợp lệ UTF-16 dữ liệu:
byte[] bytes = new byte[] { 0x41, 0x00, 0x00, 0xD8};
Bạn sẽ thấy rằng utf16_bytes không phù hợp với dữ liệu gốc.
Tôi đã viết mã sử dụng U + FFFD làm lối thoát trước các ký tự Unicode không hợp lệ; nó hoạt động, nhưng tôi muốn biết nếu có một kỹ thuật tiêu chuẩn hơn là một cái gì đó tôi chỉ nấu chín một mình. Chưa kể, tôi không thích bắt nhập DecoderFallbackException làm cách phát hiện các ký tự không hợp lệ.
Tôi đoán bạn có thể gọi đây là mã hóa "cơ sở BMP" hoặc "cơ sở UTF-16" (sử dụng tất cả các ký tự trong Unicode Basic Multilingual Plane). Có, lý tưởng tôi sẽ theo dõi Shawn Steele's advice và vượt qua khoảng byte [].
Tôi sẽ đi với đề nghị Peter Housel như câu trả lời "đúng" vì anh ấy là duy nhất mà đến gần gợi ý một "kỹ thuật tiêu chuẩn".
Sửa base16klooks thậm chí tốt hơn. Jim Beveridge có một số implementation.
nào Unicode mã hóa chính xác? .NET sử dụng UTF-8 theo mặc định, nó không hoàn toàn phù hợp với kiểu sử dụng này vì các chuỗi thoát hay bất cứ thứ gì được gọi. –
Điều tôi ngụ ý là việc thoát từng cặp byte trong UTF-8 sẽ lãng phí nhiều hơn so với phương pháp "6 bit trên 8" của Base64. –
@DrJokepu - từ/2, ** có lẽ ** UTF-16 –