如何在C#中声明一个固定数量的固定大小字符串的数组?

时间:2017-10-19 08:36:30

标签: c# arrays struct marshalling

基本上我需要的是一个字符串数组,其中数组有4个元素,每个字符串正好是16个字节。

目前我正在使用它:

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct SomeStruct
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string1; // 16 Byte String

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string2; // 16 Byte String

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string3; // 16 Byte String

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string4; // 16 Byte String
}

但我想要的是这样的:

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct SomeStruct
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string[4] strings; // 4 times 16 Byte String

}

我知道你也可以使用MarshalAs来修复数组的大小:

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    private byte[] bytes;            // 4 Byte

我如何实现我的需要?

重要的是,尺寸不会以任何方式发生变化,因为我收到包含我的结构数据的字节[],因此更改尺寸或订单会使所有内容混乱。

1 个答案:

答案 0 :(得分:0)

在尝试了几件事之后,我找到了解决问题的解决方案(或者至少是一个可接受的解决方法)。我将struct更改为class并实现了一些额外的方法:

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public class SomeClass
{
    public string[] strings()
    {
        string[] strs = new string[4];
        strs[0] = string1;
        strs[1] = string2;
        strs[2] = string3;
        strs[3] = string4;
    }

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string1; // 16 Byte String

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string2; // 16 Byte String

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string3; // 16 Byte String

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string string4; // 16 Byte String
}

对于其他数据类型,它更容易,例如我需要我的布尔值为1个字节而不是默认的4个字节:

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public class SomeClass
{

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I1)]
    public bool[] bs; // 8 times 1 Byte boolean

}

SizeConst定义数组元素的数量,而ArraySubType可用于定义数组数据类型。