gpt4 book ai didi

c# - 使用 MarshalAs 和 StructLayout 读取二进制数据

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:57 25 4
gpt4 key购买 nike

我卡在这个了。

我正在读取具有以下格式的二进制文件:

Field name  Size in bytes     Example
-------------------------------------
Date 19 1998_12_22 PM 20:15
Serial 4 0001

使用以下结构并使用 this question 的答案我正在尝试读取文件。

[StructLayout(LayoutKind.Explicit, Size=23, Pack = 1)]
struct MeasurementStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)]
[FieldOffset(0)]
public string Date;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
[FieldOffset(19)]
public string Serial;
}

但是,在实例化包含此结构的类时,我在 FieldOffset 19 处遇到错误。不幸的是,此错误是荷兰语,但它大致翻译为“无法加载 MeasurementStruct,因为 off 19 处的字段未对齐(字段可能重叠) )".

我发现将 FieldOffset[19] 更改为 FieldOffset[20] 会使错误消失。但是,在我的情况下,20 不是正确的偏移量,是吗?

最佳答案

您的数据(23 字节)和结构大小(24 字节)之间似乎存在大小问题。正常吗?

更新:Pack=1 属性应该保证内存对齐,但谷歌搜索对结构的字段对齐给出了不同的响应.您可以做的是读取字节数组中的 23 个字节,然后使用编码类提取两个字符串:

byte[] array = ... // read 23 bytes
String s1 = Encoding.ASCII.GetString(array, 0, 19);
String s2 = Encoding.ASCII.GetString(array, 19, 4);

关于c# - 使用 MarshalAs 和 StructLayout 读取二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1887554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com