在C#中将字符串写入固定长度的字节数组

时间:2010-04-07 20:19:18

标签: c# string bytearray

以某种方式无法通过谷歌搜索找到这个,但我觉得它必须简单...我需要将字符串转换为固定长度的字节数组,例如将“asdf”写入byte[20]数组。数据通过网络发送到需要固定长度字段的c ++应用程序,如果我使用BinaryWriter并逐个编写字符,它可以正常工作,并通过写'\ 0'填充它适当的次数。

有更合适的方法吗?

8 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:6)

怎么样

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 :(得分:6)

这是一种方法:

  string foo = "bar";

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

  Array.Resize(ref bytes, 20);

答案 3 :(得分:2)

您可以使用Encoding.GetBytes

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

答案 4 :(得分:1)

或许有不安全的代码?

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,但您可以手动将它们归零)

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

为了完整起见,LINQ:

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

对于变体,此片段还选择将Unicode字符直接转换为ASCII,因为前127个Unicode字符被定义为与ASCII匹配。

答案 7 :(得分:0)

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

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