명시 적 구조체 레이아웃과 구조체 오버레이를 이해하려고하는데 예상 한 동작이 보이지 않습니다.FieldOffset 예기치 않은 동작을 사용하는 구조체
IntField1 : 1
IntField2 : 2
CharArray : ABCDEF
SomeByte : 1
내가 좋아하는 뭔가가 수 있도록이에서 결과를 기대class Program { static void Main(string[] args) { byte[] bytes = new byte[17]; bytes[0] = 0x01; // Age is 1 //IntField1 bytes[1] = 0x00; //IntField1 bytes[2] = 0x00; //IntField1 bytes[3] = 0x00; //IntField1 bytes[4] = 0x02; //IntField2 bytes[5] = 0x00; //IntField2 bytes[6] = 0x00; //IntField2 bytes[7] = 0x00; //IntField2 bytes[8] = 0x41; //CharArray A bytes[9] = 0x42; //CharArray B bytes[10] = 0x43; //CharArray C bytes[11] = 0x44; //CharArray D bytes[12] = 0x45; //CharArray E bytes[13] = 0x46; //CharArray F bytes[14] = 0x00; // \0 decimal 0 bytes[15] = 0x00; // \0 decimal 0 bytes[16] = 0x01; // 1 decimal 1 Console.WriteLine(Marshal.SizeOf(typeof(TestStruct))); TestStruct testStruct2 = (TestStruct) RawDeserialize(bytes, 0, typeof (TestStruct)); Console.WriteLine(testStruct2); Console.ReadLine(); } public static object RawDeserialize(byte[] rawData, int position, Type anyType) { int rawsize = Marshal.SizeOf(anyType); if(rawsize > rawData.Length) return null; IntPtr buffer = Marshal.AllocHGlobal(rawsize); Marshal.Copy(rawData, position, buffer, rawsize); object retobj = Marshal.PtrToStructure(buffer, anyType); Marshal.FreeHGlobal(buffer); return retobj; } } [StructLayout(LayoutKind.Explicit, Pack = 1)] public struct TestStruct { [FieldOffset(0)] public int IntField1; [FieldOffset(4)] public int IntField2; [FieldOffset(8)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public char[] CharArray; [FieldOffset(16)] public byte SomeByte; [FieldOffset(8)] public TestStruct2 SubStruct; public override string ToString() { return string.Format("IntField1: {0}\nIntField2: {1}\nCharArray: {2}\nSomeByte: {3}\nSubStruct:\n{{{4}}}", IntField1, IntField2, new string(CharArray), SomeByte, SubStruct); } } [StructLayout(LayoutKind.Explicit, Pack = 1)] public struct TestStruct2 { [FieldOffset(0)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public char[] CharArray1; [FieldOffset(0)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public char[] CharArray2; [FieldOffset(4)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public char[] CharArray3; public override string ToString() { return string.Format("CharArray1: {0}\nCharArray2: {1}\nCharArray3: {2}", new string(CharArray1), new string(CharArray2), new string(CharArray3)); } }
: 아래의 코드 감안할 때 하위 구조 :
{CharArray1 : ABCDEF
CharArray2 : ABCD
CharArray3 : E}
하지만 결과는 다음
IntField1 1
IntField2 2
CharArray : ABCD
SomeByte 1
SubStruct :
{CharArray1 : ABCD
CharArray2 : ABCD
CharArray3 : EF}
왜 TestStruct의 CharArray의 길이는 4입니까? 나는 6 문자 ABCDEF를 가지고 그것을 epxected지만 그것은 ABCD만을 포함합니다. TestStruct2.CharArray1과 동일합니다.
이 게시물을 도움이되었습니다. http://m.developerfusion.com/article/84519/mastering-structs-in-c/ – SwDevMan81
Thanks. 나는 그것을 실제로 읽었고 아직도 내가 무엇을보고 있는지 이해하지 못한다. 아마도 나는 다시 조금 더 가까이 읽을 필요가있다. – Domc