2009-05-14 27 views
7

Tôi có một mảng byte mà tôi nhận được từ một thực thể bên ngoài. Nó là một kích thước cố định. Các byte chứa một chuỗi unicode, với giá trị 0 để pad ra phần còn lại của bộ đệm:Lấy chuỗi kết thúc null từ System.Text.Encoding.Unicode.GetString

Vì vậy, các byte có thể là:

H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc 

Tôi nhận được đệm đó và chuyển đổi nó thành một chuỗi như vậy :

byte[] buffer = new byte[buffSize]; 
m_dataStream.Read(buffer, 0, buffSize); 
String cmd = System.Text.Encoding.Unicode.GetString(buffer); 

gì tôi nhận được lại là một chuỗi trông như thế này:

"HELLO\0\0\0\0\0\0\0\0..." 

Làm thế nào ca n Tôi yêu cầu GetString chấm dứt chuỗi tại Unicode null đầu tiên (nghĩa là tôi chỉ lấy lại "HELLO")?

Cảm ơn mọi đầu vào.

Trả lời

8

Nếu bạn chắc chắn phần còn lại là tất cả \ 0, điều này sẽ làm việc:

cmd = cmd.TrimEnd('\0'); 

Ngược lại, nếu bạn chỉ muốn để có được tất cả mọi thứ trước khi null đầu tiên:

int index = cmd.IndexOf('\0'); 
if (index >= 0) 
    cmd = cmd.Remove(index); 

Lưu ý rằng Unicode.GetString sẽ xử lý gấp đôi \ 0. Bạn chỉ nên tìm một đơn \ 0.

1

Cách dễ nhất là cắt chuỗi sau khi chuyển đổi, như đã được đề xuất.

Nếu bạn biết số lượng ký tự trước, bạn có thể sử dụng quá tải GetString để lấy chỉ mục bắt đầu và tổng số byte, để có được chuỗi chính xác, không cắt xén.

Nếu bạn không biết số ký tự trước và muốn tránh cắt xâu chuỗi sau đó, trước tiên bạn cần cắt mảng byte, vì vậy bạn chỉ chuyển byte bạn quan tâm. Đối với Unicode, điều này sẽ có nghĩa là loại bỏ bất kỳ byte nào sau và bao gồm cặp số 0 đầu tiên.

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