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

Posted

技术标签:

【中文标题】如何在 C# 中声明具有固定数量的固定大小字符串的数组?【英文标题】:How to declare an array with a fixed number of fixed-sized strings in C#? 【发布时间】:2018-03-31 05:59:33 【问题描述】:

基本上我需要的是一个字符串数组,其中数组有 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

我怎样才能达到我的需要?

重要的是,大小不会以任何方式改变,因为我收到了一个包含我的结构数据的 byte[],所以改变大小或顺序会搞砸一切。

【问题讨论】:

我认为你不能仅仅通过编组来实现这一点。获取您的字节数组并按程序将其拆分为 4 个字符串。 @MatthewWatson 在结构上使用 Marshal.SizeOf() 时,它返回 64 字节大小。如果字符串大小为 32 字节,我收到的数据也会被弄乱,但事实并非如此。我没有在任何地方指定 UTF8。我不知道为什么,但它有效:D 啊 - 我查看的 Microsoft 文档具有误导性。对于字符串,它是字符。我删除了我原来的评论。 【参考方案1】:

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

[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 可用于定义数组数据类型。

【讨论】:

以上是关于如何在 C# 中声明具有固定数量的固定大小字符串的数组?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中具有固定大小数组的连续分层结构内存?

如何生成排列而不生成重复结果但具有固定数量的字符Python [重复]

如何在 CSS 中制作具有变化高度的固定顶部菜单栏?

Android:如何强制布局或任何视图在倾斜时具有固定大小?

具有默认值的打字稿固定数组

TypeScript:如何在编译时声明固定大小的数组以进行类型检查