0

这是我的代码,用于使用带有字节的长变量,但是当程序运行时,会发生异常并显示以下内容:

Test.exe 中发生了“System.TypeLoadException”类型的未处理异常

附加信息:无法从程序集“Test,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“Test.MyU32”,因为它包含偏移量 0 处的对象字段,该对象字段未正确对齐或重叠。对象字段。

[StructLayout(LayoutKind.Explicit)]
public struct MyU32
{
    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] Bytes;
    [FieldOffset(0)]
    public long Value;
}

请帮助我如何处理它!

4

3 回答 3

1

您的代码案例不起作用,因为您正在重叠引用和值类型(64 位 int)。您可以重叠不同的值类型和不同的引用,但不能混合使用它们。

但即使它们有效,这种低级黑客在 C# 中通常也是一个坏主意。我建议使用进行转换的属性而不是低级联合。

也许你真正想要的是:

internal static class ByteIntegerConverter
{
    public static UInt32 LoadLittleEndian32(byte[] buf, int offset)
    {
        return
            (UInt32)(buf[offset + 0])
        | (((UInt32)(buf[offset + 1])) << 8)
        | (((UInt32)(buf[offset + 2])) << 16)
        | (((UInt32)(buf[offset + 3])) << 24);
    }

    public static void StoreLittleEndian32(byte[] buf, int offset, UInt32 value)
    {
        buf[offset + 0] = (byte)value;
        buf[offset + 1] = (byte)(value >> 8);
        buf[offset + 2] = (byte)(value >> 16);
        buf[offset + 3] = (byte)(value >> 24);
    }
}

UInt32 value = ByteIntegerConverter.LoadLittleEndian32(buf, offset);
// do something with `value`
ByteIntegerConverter.StoreLittleEndian32(buf, offset, value);

无论计算机的本地字节序如何,这总是使用小字节序。如果你想要原生的endinness,你可以检查BitConverter.IsLittleEndian并使用不同的移位常量,如果它是大端的。

于 2013-07-28T11:11:58.573 回答
0

我解决了我的问题

向所有投入时间的机构致敬。

public struct MyU32
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] Bytes;
    public uint Value
    {
        get { return ((uint)Bytes[0] + Bytes[1] << 8 + Bytes[2] << 16 + Bytes[3] << 24); }
        set 
        { 
            Bytes[0] = (byte)(value & 0xFF);
            Bytes[1] = (byte)(value>>8 & 0xFF);
            Bytes[2] = (byte)(value>>16 & 0xFF);
            Bytes[3] = (byte)(value>>24 & 0xFF);
        }
    }
}
于 2013-07-28T11:34:58.163 回答
0

我不太确定,但我认为问题是由值类型和引用类型之间的重叠引起的。应该可以只重叠值类型。因为如果可以重叠值类型引用类型,您可以直接更改引用。出于明显的安全原因,这是不可能的。

Asbyte[]引用类型(与 .NET 中的所有数组一样)。你不能有Value重叠Bytes

如果您习惯于 C,您的结构(没有显式布局)将“类似于”:

struct MyU32
{
    byte* Bytes;
    long Value;
}

但它不类似于:

struct MyU32
{
    byte Bytes[4];
    long Value;
}
于 2013-07-28T10:58:45.657 回答