如何从相同大小的其他结构转换/铸造(在位级别)结构?

时间:2018-07-26 06:13:35

标签: c#

假设我有两个128位结构...

struct OldInfo
{
    int  Id,
    int  Tag,
    long Code
}

struct NewInfo
{
    short Kind,
    long  Key,
    int   Data,
    short Value
}

然后我要...

var old = new OldInfo();
. . .
var new = (NewInfo)old;   // Cast bit by bit as they have same size

那么,如何快速地从另一个相同大小的结构上转换(以位级别)? 也许使用一些按位操作?还是“不安全”?或使用“ StructLayout”属性?

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

按照书面规定,两个结构的大小不同。这是因为NewInfo.Keylong,因此通常在8个字节的边界上对齐...因此,KindKey之间有6个空字节的“间隙”(您可以尝试进行Marshal.SizeOf(typeof(NewInfo)))。但是您可以应用[StructLayout]属性来解决此问题。

struct OldInfo
{
    public int Id;
    public int Tag;
    public long Code;
}

[StructLayout(LayoutKind.Auto, Pack = 1)]
struct NewInfo
{
    public short Kind;
    public long Key;
    public int Data;
    public short Value;
}

现在... Microsoft的一个完全不安全的System.Runtime.CompilerServices.Unsafe库:

int s1 = Unsafe.SizeOf<OldInfo>();
int s2 = Unsafe.SizeOf<NewInfo>();
Debug.Assert(s1 == s2);

OldInfo oi = new OldInfo { Id = 1, Tag = 2, Code = 3 } ;
NewInfo ni = Unsafe.As<OldInfo, NewInfo>(ref oi);

该库非常不安全,它不会告诉您结构的大小是否不同:-)它会复制并覆盖内存中的重要内容:-)