2010-04-07 2 views
10

ne pouvait pas trouver cela avec une recherche google, mais je pense que cela doit être simple ... J'ai besoin de convertir une chaîne en un tableau d'octets de longueur fixe, par exemple écrire "asdf" dans un tableau byte[20]. les données sont envoyées sur le réseau à une application C++ qui attend un champ de longueur fixe, et cela fonctionne très bien si j'utilise un BinaryWriter et écris les caractères un par un, et le remplit en écrivant '\ 0' un nombre approprié de fois.Écrire une chaîne à un tableau d'octets de longueur fixe en C#

Y a-t-il une façon plus appropriée de faire cela?

Répondre

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

Cela remplira le tampon avec des espaces (0x20), pas le caractère nul (0x0) mentionné par l'affiche. Sinon, c'est génial. – Dathan

+0

oui, mais ça marche bien si j'utilise simplement '\ 0' à la place. Merci! – toasteroven

+2

Aussi - assurez-vous que "str" ​​n'est pas> 20 caractères, ou vous aurez des ennuis ... –

2

Vous pouvez utiliser Encoding.GetBytes.

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

utilisant System.Math.Min est une approche intelligente. – Demir

5

Que diriez-vous

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

Si str.Length> 20, cela ne fonctionnera pas ... –

+0

@Reed Bon appel. J'ai corrigé ce bug. – Dathan

1

Avec peut-être un code dangereux?

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

(les octets dans la mémoire tampon sera par défaut à 0, mais vous pouvez toujours les zéro manuellement)

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

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

C'est une façon de le faire:

string foo = "bar"; 

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

    Array.Resize(ref bytes, 20); 
1

Et pour l'exhaustivité, LINQ:

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

Pour la Ce snippet choisit également de convertir le caractère Unicode directement en ASCII, puisque les 127 premiers caractères Unicode sont définis pour correspondre à ASCII.

Questions connexes