gpt4 book ai didi

c# - 在 Compact Framework 中将字节数组转换为结构

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

我需要将字节数组转换为我的结构类型。为此,我将以下代码用于桌面项目应用程序:

var str = new SFHeader();
int size = Marshal.SizeOf(str);

IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer, 0, ptr, size);
str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));
Marshal.FreeHGlobal(ptr);

return str;

SFHeader 是我的结构。

问题在于该行:

str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));

当我从智能设备项目运行此代码时抛出 NotSupportedException。在 Compact Framework 中是否有其他方法可以完成这项工作?

[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{

internal const int MAX_FILENAME_LENGTH = 32;


[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)]
public string FileName;

public int Offset;

public short Size;

public byte Flags;

public byte Source;

public long LastWriteTime;

}

最佳答案

Marshal.PtrToStructure 有效,我在紧凑型框架中多次使用它。看起来您正在正确使用它。因此,问题一定是您的结构定义(CF 中可能不支持该结构的某些内容)

以下代码在我使用 Windows CE 5.0 和 .NET CF 3.5 的设备上运行得很好

[StructLayout(LayoutKind.Sequential)]
public struct SFHeader
{
internal const int MAX_FILENAME_LENGTH = 32;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)]
public string FileName;
public int Offset;
public short Size;
public byte Flags;
public byte Source;
public long LastWriteTime;
}

private static void Test()
{
var str = new SFHeader();
int size = Marshal.SizeOf(str);
byte[] buffer = new byte[size];

IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(buffer, 0, ptr, size);
str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader));
Marshal.FreeHGlobal(ptr);
}

我会检查以确保您遵循这些准则 Marshaling Structures in the .NET Compact Framework

另一种选择是手动逐字节地将缓冲区中的字段复制到结构中。您可以编写一个返回 SFHeader 并采用 byte[] 的函数。

关于c# - 在 Compact Framework 中将字节数组转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418795/

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