åä¸æ®µæ¶é´ç¨Socketåäºä¸ä¸ªå¯ç¨äºWindows Mobile 6.1çdllï¼ç¨äºå¨ç½ç»ä¸ä¼ è¾åç§æ件ï¼æ¯ææç¹ç»ä¼ ï¼å ¶æå¡å¨æ¯å¨Windows XPä¸åçï¼å¼åè¯è¨æ¯C#ãå¨æåçæµè¯é¶æ®µåºäºé®é¢ï¼ç»è¿ä¸å¤©çè·è¸ªåè°è¯ï¼ç»äºæ¾å°é®é¢æå¨ï¼å®¢æ·ç«¯åæå¡å¨å¨äº¤äºçæ¶åï¼ç¨äºä¿¡æ¯äº¤æ¢çç»æä½å¨ä¸¤ç«¯è§£æåºéäºãè¿ä¸ªBugçæ¯æ²¡ææ³å°ï¼å 为æç代ç çè¿ä¸ªæ¨¡åå¨Windows XPå¹³å°é½æµè¯æ¯æ£ç¡®çï¼èä¸ç³»ç»æ示çåºéä¿¡æ¯é½æ¯ç½ç»è¿æ¥ä¸é¢çé®é¢ï¼å¯¼è´è°è¯ç大é¨åç²¾åé½æ¾å¨æ 线ç½ç»ä¸ã
      好äºï¼è¨å½æ£ä¼ ï¼ç°å¨è¯´é®é¢å解å³æ¹æ³ãæå¨ç¨åºä¸å®ä¹äºä¸ä¸ªç»æä½ï¼
       [StructLayoutAttribute(LayoutKind.Sequential)]
       public struct filemessage
       {
           [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
           public string myid;
           [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
           public string filename;
           [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
           public string filepath;
           public System.Int32 tmpseek;   Â
           public System.Int32 filesize;  Â
           public System.Int32 sysmark;
       };
      StructLayoutAttribute 类使ç¨æ·å¯ä»¥æ§å¶ç±»æç»æçæ°æ®å段çç©çå¸å±ï¼å¼ Sequential ç¨äºå¼ºå¶å°æåæå ¶åºç°ç顺åºè¿è¡é¡ºåºå¸å±ï¼å¨è¿ä¸ªStructéé¢ï¼å®ä¹äºæ¯ä¸ªstring æåç大å°ï¼é£ä¹æ³å½ç¶ç认为è¿ä¸ªStructç大å°ä¸º172Bytesãçç¡®ï¼æå¨Windows XPä¸ç¨Marshal.SizeOf( )æµè¯å¾å°å ¶å¤§å°ä¹æ¯è¿ä¹å¤ï¼ä½å°äºWindows Mobile 6.1ä¸ï¼å ¶å¤§å°è¿æ¯è¿ä¹å¤åï¼ç¨åæ ·çæµè¯æ¹æ³ï¼åç°äºé®é¢ï¼æµè¯å¾å°å ¶å¤§å°ä¸º332bytesï¼ä¸¤ç«¯å¯¹è¿ä¸ªStructçé»è®¤ç»æä¸ä¸æ ·ï¼äºæ¯åºç°äºå¯¹è¯¥ç»æä½ç解æé®é¢ã
      为äºåç°é®é¢ï¼ç»§ç»ä½äºä¸ç³»åçæµè¯ï¼è®¾ç½®StructLayoutAttribute ç±»æåCharSetçå¼ä¸ºAutoï¼Unicodeï¼Ansiï¼XPç¬æï¼ï¼å¨Windows XPåWindows Mobile 6.1ä¸æµè¯ï¼å ¶å¤§å°åå«ä¸ºï¼332bytesï¼332bytesï¼172byteså332bytesï¼332bytesãæ以é®é¢åºå¨ä¸¤ä¸ªå¹³å°å¯¹CharSetå段çé»è®¤å¼çä¸åé æçã
      åæ¥çMSDNï¼å¯¹äºCharSetæå¦ä¸æè¿°ï¼å¦æ CharSet å段设置为 CharSet.Unicodeï¼åææå符串åæ°å¨ä¼ éå°éæ管å®ç°ä¹åé½è½¬æ¢æ Unicode å符 (LPWSTR)ãå¦æ该å段设置为 CharSet.Ansiï¼åå符串å°è½¬æ¢æ ANSI å符串 (LPSTR)ãå¦æ CharSet å段设置为 CharSet.Autoï¼å转æ¢ä¸å¹³å°ç¸å ³ï¼å¨ Windows NTãWindows 2000ãWindows XP å Windows Server 2003 ç³»åä¸ä¸º Unicodeï¼å¨ Windows 98 å Windows Me ä¸ä¸º ANSIï¼ã
      äºæ¯é®é¢å°±å¯ä»¥è§£å³äºï¼åªè¦è®¾ç½®StructLayoutAttribute ç±»æåCharSetçå¼ä¸ºAutoæUnicodeå³å¯ã
      æåæç解å³æ¹æ³æ¯ï¼éæ°å¯¹è¯¥Structè¿è¡å®ä¹ï¼å¦ä¸
       [StructLayoutAttribute(LayoutKind.Explicit, CharSet = CharSet.Unicode)]
       public struct filemessage
       {
           [FieldOffset(0)]
           [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
           public string myid;
           [FieldOffset(32)]
           [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
           public string filename;
           [FieldOffset(96)]
           [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
           public string filepath;
           [FieldOffset(160)]
           public System.Int32 tmpseek;  Â
           [FieldOffset(164)]
           public System.Int32 filesize;  Â
           [FieldOffset(168)]
           public System.Int32 sysmark;
       };
      Explicit æ§å¶æ¯ä¸ªæ°æ®æåç精确ä½ç½®ãæå该structç大å°ä¸º224bytesï¼å¨Windows XPä¸ï¼è¥ä¸è®¾ç½®CharSetçå¼ï¼å大å°ä¸º172bytesï¼èWM6.1ä¸ä¸º332bytesãå¦å¤æ¹åæºæä½æåçä½ç½®ï¼å¦å°filenameæ¾å°æåï¼ç»æä½ç大å°ä¹ä¼åï¼ä¸é¢è¿ç§æåæå使ç»æä½ç大å°æå°ã
      ä½é®é¢è¿æ²¡å®ï¼ä¸ä¸ªå¼å§è®¤ä¸ºå¤§å°åªæ172Bytesçç»æä½æä¹ç°å¨åæäº332bytesçï¼å¤ä½çåèå°åªéå»äºï¼è¿éæ¶åå°äºä¸ä¸ªå å对é½ï¼+å ¶ä»ï¼ï¼çé®é¢ï¼è¯¸ä½çå®å¯ä»¥æç´¢ä¸ä¸ï¼æå¨è¿éå å°±ä¸å¤è¯´äºï¼å 为æèªå·±ä¹è¿æ²¡æå®å ¨ææç½ï¼å¾ ç解è¿æ¥ååè¡¥ä¸ï¼æåªä½é«æææä¸ä¸ï¼ä¸èææ¿ï¼ï¼
     éï¼å¨C#/Socketç¼ç¨ä¸ç»æä½åbyte[]ä¹é´çç¸äºè½¬æ¢æ¹æ³ã
        byte[] StructToBytes(object structObj)
       {
           int size = Marshal.SizeOf(structObj);
           IntPtr buffer = Marshal.AllocHGlobal(size);
           try
           {
               Marshal.StructureToPtr(structObj, buffer, false);
               byte[] bytes = new byte[size];
               Marshal.Copy(buffer, bytes, 0, size);
               return bytes;
           }
           finally
           {
               Marshal.FreeHGlobal(buffer);
           }
       }
       object BytesToStruct(byte[] bytes, Type strcutType)
       {
           int size = Marshal.SizeOf(strcutType);
           if (size > bytes.Length)
           {
               return null;
           }
           IntPtr buffer = Marshal.AllocHGlobal(size);
           try
           {
               Marshal.Copy(bytes, 0, buffer, size);
               return Marshal.PtrToStructure(buffer, strcutType);
           }
           finally
           {
               Marshal.FreeHGlobal(buffer);
           }
       }
Â
Â
Â
Â
Â
转载äº:https://www.cnblogs.com/carrey/archive/2009/04/07/Carrey.html