2010-04-07 8 views
10

bằng cách nào đó không thể tìm thấy điều này với tìm kiếm google, nhưng tôi cảm thấy nó phải đơn giản ... Tôi cần chuyển đổi chuỗi thành mảng byte có độ dài cố định, ví dụ viết "asdf" vào mảng byte[20]. dữ liệu đang được gửi qua mạng tới ứng dụng C++ dự kiến ​​một trường có độ dài cố định và nó hoạt động tốt nếu tôi sử dụng BinaryWriter và viết từng ký tự một và dán ký tự bằng cách viết '\ 0' một số thích hợp lần.Viết chuỗi vào mảng byte có độ dài cố định trong C#

có cách nào phù hợp hơn để thực hiện việc này không?

Trả lời

19
static byte[] StringToByteArray(string str, int length) 
{ 
    return Encoding.ASCII.GetBytes(str.PadRight(length, ' ')); 
} 
+2

Điều này sẽ đệm bộ đệm bằng dấu cách (0x20), không phải ký tự rỗng (0x0) được áp phích đề cập. Nếu không thì điều này thật tuyệt. – Dathan

+0

có, nhưng nó hoạt động tốt nếu tôi chỉ sử dụng '\ 0' thay thế. cảm ơn! – toasteroven

+2

Ngoài ra - hãy chắc chắn rằng "str" ​​không phải là> 20 ký tự, hoặc bạn sẽ gặp rắc rối ... –

2

Bạn có thể sử dụng Encoding.GetBytes.

byte[] byteArray = new byte[20]; 
Array.Copy(Encoding.ASCII.GetBytes(myString), byteArray, System.Math.Min(20, myString.Length); 
+0

sử dụng System.Math.Min là một cách tiếp cận thông minh. – Demir

5

Làm thế nào về

String str = "hi"; 
Byte[] bytes = new Byte[20]; 
int len = str.Length > 20 ? 20 : str.Length; 
Encoding.UTF8.GetBytes(str.Substring(0, len)).CopyTo(bytes, 0); 
+0

Nếu str.Length> 20, điều này sẽ không hoạt động ... –

+0

@Reed Cuộc gọi tốt. Tôi đã sửa lỗi đó. – Dathan

1

Với mã không an toàn có lẽ?

unsafe static void Main() { 
    string s = "asdf"; 
    byte[] buffer = new byte[20]; 
    fixed(char* c = s) 
    fixed(byte* b = buffer) { 
     Encoding.Unicode.GetBytes(c, s.Length, b, buffer.Length); 
    } 
} 

(các byte trong bộ đệm sẽ mặc định là 0, nhưng bạn luôn có thể bằng không chúng bằng tay)

1
Byte[] bytes = new Byte[20]; 
String str = "blah"; 

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
bytes = encoding.GetBytes(str); 
4

Đây là một cách để làm điều đó:

string foo = "bar"; 

    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(foo); 

    Array.Resize(ref bytes, 20); 
1

Và chỉ để hoàn thành, LINQ:

(str + new String(default(Char), 20)).Take(20).Select(ch => (byte)ch).ToArray(); 

Đối với biến thể, thứ là đoạn mã cũng chọn để đúc ký tự Unicode trực tiếp thành ASCII, vì 127 ký tự Unicode đầu tiên được định nghĩa để khớp với ASCII.