2009-09-09 49 views
22

Tôi có một mảng byte tương tự như sau (16 byte):Chuỗi từ mảng byte không được cắt bớt trong C#?

71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00 

tôi sử dụng để chuyển đổi nó thành một chuỗi và cắt các không gian kết thúc:

ASCIIEncoding.ASCII.GetString(data).Trim(); 

tôi nhận được chuỗi tốt, tuy nhiên nó vẫn có tất cả các khoảng trống. Vì vậy, tôi nhận được một cái gì đó như "qwerty.........." (trong đó dấu chấm là khoảng trống do StackOverflow).

Tôi đang làm gì sai?

Tôi cũng đã cố gắng sử dụng .TrimEnd() và sử dụng mã hóa UTF8, nhưng nó không thay đổi bất cứ điều gì.

Cảm ơn trước :)

+3

Liệu mảng byte của bạn kết thúc trong 00 byte hoặc 20 byte? Một không gian là 0x20 không phải 0x00. –

+1

Nếu mảng byte của bạn xuất phát từ MemoryStream, hãy chắc chắn rằng bạn gọi 'ToArray()' và không phải 'GetBuffer()', vì GetBuffer sẽ bao gồm dữ liệu "chưa được lấp đầy", kết quả là tất cả các terminators của '\ 0's –

Trả lời

31

Bạn phải làm TrimEnd(new char[] { (char)0 }); để sửa lỗi này. Nó không phải là không gian - nó thực sự là các ký tự rỗng được chuyển đổi một cách kỳ lạ. Tôi cũng gặp vấn đề này.

+6

không có gì để làm với mã hóa ASCII. Có vẻ như @Lazlo có một mảng byte có kích thước cố định giữ một chuỗi được mã hóa ASCII có độ dài thay đổi, vì vậy chuỗi phải được đệm bằng các ký tự null để phù hợp với kích thước mảng – dtb

+0

@dtb: Phải. Đúng đúng. –

+0

Cảm ơn bạn :) Tôi nghĩ đó là một cái gì đó như thế này, nhưng không dám thử. – Lazlo

20

Chúng không phải thực sự không gian:

System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0') 

... nên làm các trick.

-Oisin

7

Trim theo mặc định removes only whitespace, nơi khoảng trắng được xác định bởi char.IsWhitespace.

'\0' là một ký tự điều khiển, không phải khoảng trắng.

Bạn có thể xác định những nhân vật để cắt bằng cách sử dụng Trim(char[]) quá tải:

string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' }); 
1

Tại sao cố gắng tạo ra các chuỗi đầu tiên và cắt nó thứ hai? Điều này có thể thêm rất nhiều chi phí (nếu byte [] lớn).

Bạn có thể chỉ định indexcount trong quá tải GetString(byte[] bytes, int index, int count).

int count = data.Count(bt => bt != 0); // find the first null 
string result = Encoding.ASCII.GetString(data, 0, count); // Get only the characters you want 
0

Trong PowerShell, bạn có thể làm điều này:

$yourString.TrimEnd(0x00) 
Các vấn đề liên quan