假设我有两个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”属性?
感谢您的时间!
答案 0 :(得分:1)
按照书面规定,两个结构的大小不同。这是因为NewInfo.Key
是long
,因此通常在8个字节的边界上对齐...因此,Kind
和Key
之间有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);
该库非常不安全,它不会告诉您结构的大小是否不同:-)它会复制并覆盖内存中的重要内容:-)