Записать строку в байтовый массив фиксированной длины в C # - PullRequest
13 голосов
/ 08 апреля 2010

как-то не смог найти это с помощью поиска в Google, но я чувствую, что все должно быть просто ... Мне нужно преобразовать строку в байтовый массив фиксированной длины, например, записать «asdf» в byte[20]массив.данные передаются по сети в приложение c ++, которое ожидает поле фиксированной длины, и оно работает нормально, если я использую BinaryWriter и пишу символы один за другим, и дополняю их, записывая '\ 0' соответствующийколичество раз.

есть ли более подходящий способ сделать это?

Ответы [ 8 ]

21 голосов
/ 08 апреля 2010
static byte[] StringToByteArray(string str, int length) 
{
    return Encoding.ASCII.GetBytes(str.PadRight(length, ' '));
}   
7 голосов
/ 08 апреля 2010

Это один из способов сделать это:

  string foo = "bar";

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

  Array.Resize(ref bytes, 20);
6 голосов
/ 08 апреля 2010

Как насчет

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);
2 голосов
/ 08 апреля 2010

Вы можете использовать Encoding.GetBytes .

byte[] byteArray = new byte[20];
Array.Copy(Encoding.ASCII.GetBytes(myString), byteArray, System.Math.Min(20, myString.Length);
1 голос
/ 10 апреля 2011

И просто для полноты, LINQ:

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

Для вариаций этот фрагмент также выбирает приведение символа Unicode непосредственно к ASCII, поскольку первые 127 символов Unicode определены как соответствующие ASCII.

1 голос
/ 08 апреля 2010
Byte[] bytes = new Byte[20];
String str = "blah";

System.Text.ASCIIEncoding  encoding = new System.Text.ASCIIEncoding();
bytes = encoding.GetBytes(str);
1 голос
/ 08 апреля 2010

Возможно, с небезопасным кодом?

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

(байты в буфере по умолчанию будут равны 0, но вы всегда можете обнулить их вручную)

0 голосов
/ 12 декабря 2011

FieldOffset, может быть?

[StructLayout(LayoutKind.Explicit)]
public struct struct1
{
    [FieldOffset(0)]
        public byte a;
    [FieldOffset(1)]
        public int b;
    [FieldOffset(5)]
        public short c;
    [FieldOffset(8)]
        public byte[] buffer;
    [FieldOffset(18)]
        public byte d;
}

(с) http://www.developerfusion.com/article/84519/mastering-structs-in-c/

...