2009-07-15 18 views
59

Tôi không thực sự quan tâm đến mã hóa và nội dung, miễn là tôi lấy lại chính xác mảng byte đó.Làm thế nào tôi có thể chuyển đổi một mảng an toàn thành chuỗi và quay lại một cách an toàn?

Vì vậy, để tổng hợp: Làm thế nào để chuyển đổi một mảng byte thành một chuỗi, và sau đó chuỗi đó trở lại vào cùng một mảng byte tôi bắt đầu với?

+1

@Mehrdad et al, đây không phải là câu hỏi giống như "Chuỗi .NET đến byte mảng C#". Câu hỏi ở đây là - làm cách nào để chuyển đổi từ mảng byte thành chuỗi và quay lại, an toàn. Tôi sử dụng mã hóa Latin1 "huyền diệu" (Encoding.GetEncoding (28591)) mà dường như tôn trọng byte => string => byte độc ​​đáo. – Liam

Trả lời

122

an toàn nhất cách tuyệt đối để chuyển đổi byte vào một chuỗi và trở lại là sử dụng base64:

string base64 = Convert.ToBase64String(bytes); 
byte[] bytes = Convert.FromBase64String(base64); 

Bằng cách đó bạn sẽ được bảo đảm không để có được chuỗi unicode "không hợp lệ" như nửa đầu của một đại diện cặp mà không có nửa thứ hai. Không có gì sẽ quyết định để bình thường hóa dữ liệu vào một cái gì đó kỳ lạ (đó là tất cả ASCII). Không có cơ hội sử dụng các điểm mã không được đăng ký trong Unicode, hoặc bất cứ thứ gì như thế. Ồ, và bạn có thể cắt và dán mà không sợ nhiều.

Có, bạn kết thúc với 4 ký tự cho mỗi 3 byte - nhưng đó là một mức giá nhỏ để trả tiền cho kiến ​​thức rằng dữ liệu của bạn sẽ không bị hỏng.

+0

Bài đăng này sẽ thay thế câu trả lời ở trên. :) –

+0

Xong. Không nhìn thấy ghi chú lúc đầu. Rất quan trọng! Cảm ơn, một lần nữa Jon Skeet =) – Svish

+2

Một lần nữa ông Skeet trả lời một câu hỏi của tôi, và một lần nữa ông đã làm điều đó trước khi tôi thậm chí còn hỏi nó. :) – UnkwnTech

2

Bạn chỉ có thể sử dụng lớp Convert như dưới đây.

/// <summary> 
/// Converts a string to byte array 
/// </summary> 
/// <param name="input">The string</param> 
/// <returns>The byte array</returns> 
public static byte[] ConvertToByteArray(string input) 
{ 
    return input.Select(Convert.ToByte).ToArray(); 
} 

/// <summary> 
/// Converts a byte array to a string 
/// </summary> 
/// <param name="bytes">the byte array</param> 
/// <returns>The string</returns> 
public static string ConvertToString(byte[] bytes) 
{ 
    return new string(bytes.Select(Convert.ToChar).ToArray()); 
} 

/// <summary> 
/// Converts a byte array to a string 
/// </summary> 
/// <param name="bytes">the byte array</param> 
/// <returns>The string</returns> 
public static string ConvertToBase64String(byte[] bytes) 
{ 
    return Convert.ToBase64String(bytes); 
} 
+1

Hãy cẩn thận khi đăng bản sao và dán các câu trả lời soạn sẵn/trả lời đúng cho nhiều câu hỏi, những câu hỏi này có xu hướng bị cộng đồng gắn cờ là "spam". Nếu bạn đang làm điều này thì nó thường có nghĩa là các câu hỏi là các bản sao để gắn cờ chúng như vậy thay vào đó: http://stackoverflow.com/questions/472906 – Kev

+0

Phải xin lỗi về điều đó, vẫn tiếp xúc với Stack; Tôi đã xóa các câu trả lời khác, không chắc chắn cách gắn cờ nó là trùng lặp: -S –

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