2010-04-07 23 views
10

irgendwie konnte dies nicht mit einer Google-Suche finden, aber ich fühle mich wie es muss einfach sein ... Ich muss eine Zeichenfolge in eine feste Länge Byte-Array konvertieren, z.B schreibe "asdf" in ein byte[20] Array. Die Daten werden über das Netzwerk an eine C++ App gesendet, die ein Feld fester Länge erwartet, und es funktioniert gut, wenn ich eine BinaryWriter benutze und die Zeichen einzeln schreibe, und pad es, indem ich '\ 0' eine entsprechende Anzahl von schreiben mal.Write String in fester Länge Byte-Array in C#

Gibt es einen geeigneteren Weg, dies zu tun?

Antwort

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

Dadurch wird der Puffer mit Leerzeichen (0x20) gefüllt, nicht das Nullzeichen (0x0), das vom Poster erwähnt wird. Ansonsten ist das toll. – Dathan

+0

ja, aber es funktioniert gut, wenn ich nur '\ 0' stattdessen benutze. Vielen Dank! – toasteroven

+2

Auch - stellen Sie sicher, dass "str" ​​ist nicht> 20 Zeichen, oder Sie werden in Schwierigkeiten sein ... –

2

Sie können Encoding.GetBytes verwenden.

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

System.Math.Min verwendet, ist ein Smart-Ansatz. – Demir

5

Wie wäre es

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

Wenn str.Length> 20, wird dies nicht funktionieren ... –

+0

@Reed Guter Anruf. Ich habe diesen Fehler behoben. – Dathan

1

Mit vielleicht unsicheren Code?

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); 
    } 
} 

(die Bytes in dem Puffer wird auf 0 standardmäßig, aber Sie können sie manuell immer Null)

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

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

Dies ist eine Möglichkeit, es zu tun:

string foo = "bar"; 

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

    Array.Resize(ref bytes, 20); 
1

Und der Vollständigkeit halber, LINQ:

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

Für Variation, th Snippet wird auch verwendet, um das Unicode-Zeichen direkt in ASCII zu konvertieren, da die ersten 127 Unicode-Zeichen ASCII-konform sind.