日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
概述C#語(yǔ)言的結(jié)構(gòu)體

最近一直在研究。Net Micro Framework字體文件(tinyfnt),由于tinyfnt文件頭部有一段描述數(shù)據(jù),所以很想定義一個(gè)結(jié)構(gòu)體,像VC一樣直接從文件中讀出來(lái),省得用流一個(gè)個(gè)解析很是麻煩。

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、虛擬空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、啟東網(wǎng)站維護(hù)、網(wǎng)站推廣。

沒(méi)有想到在C#中竟沒(méi)有直接的指令,想必C#設(shè)計(jì)者認(rèn)為提供了流和序列化技術(shù),一切問(wèn)題都可以迎刃而解了。

C#語(yǔ)言的結(jié)構(gòu)體是一個(gè)比較復(fù)雜的東西,在此之上有很多需要設(shè)置的參數(shù),否則用起來(lái)就很容易出錯(cuò)。下面是msdn上一段描述,看看也許有助于理解C#語(yǔ)言的結(jié)構(gòu)體。

通過(guò)使用屬性可以自定義結(jié)構(gòu)在內(nèi)存中的布局方式。例如,可以使用 StructLayout(LayoutKind.Explicit) 和 FieldOffset 屬性創(chuàng)建在 C/C++ 中稱(chēng)為聯(lián)合的布局。

 
 
 
  1. [System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]  
  2. struct TestUnion  
  3. {  
  4. [System.Runtime.InteropServices.FieldOffset(0)]  
  5. public int i;  
  6. [System.Runtime.InteropServices.FieldOffset(0)]  
  7. public double d;  
  8. [System.Runtime.InteropServices.FieldOffset(0)]  
  9. public char c;  
  10. [System.Runtime.InteropServices.FieldOffset(0)]  
  11. public byte b;  

在上一個(gè)代碼段中,TestUnion 的所有字段都從內(nèi)存中的同一位置開(kāi)始。

以下是字段從其他顯式設(shè)置的位置開(kāi)始的另一個(gè)示例。

 
 
 
  1. [System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]  
  2. struct TestExplicit  
  3. {  
  4. [System.Runtime.InteropServices.FieldOffset(0)]  
  5. public long lg;  
  6. [System.Runtime.InteropServices.FieldOffset(0)]  
  7. public int i1;  
  8. [System.Runtime.InteropServices.FieldOffset(4)]  
  9. public int i2;  
  10. [System.Runtime.InteropServices.FieldOffset(8)]  
  11. public double d;  
  12. [System.Runtime.InteropServices.FieldOffset(12)]  
  13. public char c;  
  14. [System.Runtime.InteropServices.FieldOffset(14)]  
  15. public byte b;  

i1 和 i2 這兩個(gè) int 字段共享與 lg 相同的內(nèi)存位置。使用平臺(tái)調(diào)用時(shí),這種結(jié)構(gòu)布局控制很有用。

我做了一個(gè)簡(jiǎn)單的測(cè)試程序,基本達(dá)成預(yù)定需求,不過(guò)程序該方式要求比較苛刻,如果要解析的數(shù)據(jù)與轉(zhuǎn)換C#語(yǔ)言的結(jié)構(gòu)體不匹配就會(huì)引發(fā)一系列莫名其妙的異常(如內(nèi)存不可讀等等之類(lèi)),下面是測(cè)試程序的源代碼,有興趣的朋友可以看一看,也希望網(wǎng)友能提出更好的方案。

 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using System.IO;  
  9. using System.Runtime.InteropServices;  
  10.  
  11. namespace RWFile  
  12. {  
  13. public partial class Form1 : Form  
  14. {  
  15. public Form1()  
  16. {  
  17. InitializeComponent();  
  18. }  
  19. //從文件中讀結(jié)構(gòu)體  
  20. private void button1_Click(object sender, EventArgs e)  
  21. {  
  22. string strFile = Application.StartupPath + "\\test.dat";  
  23. if (!File.Exists(strFile))  
  24. {  
  25. MessageBox.Show("文件不存在");  
  26. return;  
  27. }  
  28.  
  29. FileStream fs = new FileStream(strFile, FileMode.Open,  
  30.  
  31. FileAccess.ReadWrite);  
  32. TestStruct ts = new TestStruct();  
  33. byte[] bytData = new byte[Marshal.SizeOf(ts)];  
  34. fs.Read(bytData, 0, bytData.Length);  
  35. fs.Close();  
  36. ts = rawDeserialize(bytData);  
  37. textBox1.Text = ts.dTest.ToString();  
  38. textBox2.Text = ts.uTest.ToString();  
  39. textBox3.Text = Encoding.Default.GetString(ts.bTest);  
  40. }  
  41.  
  42. //向文件中寫(xiě)結(jié)構(gòu)體  
  43. private void button2_Click(object sender, EventArgs e)  
  44. {  
  45. string strFile = Application.StartupPath + "\\test.dat";  
  46. FileStream fs = new FileStream(strFile, FileMode.Create ,  
  47. FileAccess.Write);  
  48. TestStruct ts = new TestStruct();  
  49. ts.dTest = double.Parse(textBox1.Text);  
  50. ts.uTest = UInt16.Parse(textBox2.Text);  
  51. ts.bTest = Encoding.Default.GetBytes(textBox3.Text);  
  52. byte[] bytData = rawSerialize(ts);  
  53. fs.Write(bytData, 0, bytData.Length);  
  54. fs.Close();  
  55. }  
  56.  
  57. [StructLayout(LayoutKind.Sequential,CharSetCharSet = CharSet.Ansi)] //,Size=16 
  58. public struct TestStruct  
  59. {  
  60. [MarshalAs(UnmanagedType.R8)] //,FieldOffset(0)]   
  61. public double dTest;  
  62. [MarshalAs(UnmanagedType.U2)] //, FieldOffset(8)]  
  63. public UInt16 uTest;  
  64. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]  
  65. //, FieldOffset(10)]  
  66. public byte[] bTest;  
  67. }  
  68.  
  69. //序列化  
  70. public static byte[] rawSerialize(object obj)  
  71. {  
  72. int rawsize = Marshal.SizeOf(obj);  
  73. IntPtr buffer = Marshal.AllocHGlobal(rawsize);  
  74. Marshal.StructureToPtr(obj, buffer, false);  
  75. byte[] rawdatas = new byte[rawsize];  
  76. Marshal.Copy(buffer, rawdatas, 0, rawsize);  
  77. Marshal.FreeHGlobal(buffer);  
  78. return rawdatas;  
  79. }  
  80.  
  81. //反序列化  
  82. public static TestStruct rawDeserialize(byte[] rawdatas)  
  83. {  
  84. Type anytype = typeof(TestStruct);  
  85. int rawsize = Marshal.SizeOf(anytype);  
  86. if (rawsize > rawdatas.Length) return new TestStruct();  
  87. IntPtr buffer = Marshal.AllocHGlobal(rawsize);  
  88. Marshal.Copy(rawdatas, 0, buffer, rawsize);  
  89. object retobj = Marshal.PtrToStructure(buffer, anytype);  
  90. Marshal.FreeHGlobal(buffer);  
  91. return (TestStruct)retobj;  
  92. }        
  93. }  

文章標(biāo)題:概述C#語(yǔ)言的結(jié)構(gòu)體
瀏覽路徑:http://www.5511xx.com/article/dhecjis.html