【发布时间】: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 文档具有误导性。对于字符串,它是字符。我删除了我原来的评论。
标签: c# arrays struct marshalling