使用的TcpListener一個byte []數組,我接收來自客戶端和立即嘗試一個字節數組來創建(經由Marshal.PtrToStructure)試圖轉換所接收通過套接字成一個結構
一個stuct出它這是我到目前爲止有:
public static void ClientListener(object obj)
{
TcpClient client = (TcpClient)obj;
NetworkStream netStream = client.GetStream();
MemoryStream memStream = new MemoryStream();
byte[] bytes = new byte[client.ReceiveBufferSize];
int bytesRead;
while((bytesRead = netStream.Read(bytes, 0, bytes.Length)) > 0)
{
memStream.Write(bytes, 0, bytesRead);
}
byte[] result = memStream.ToArray();
Record test = new Record();
test = ByteToStruct<Record>(result);
Console.WriteLine(test.Station);
netStream.Close();
memStream.Close();
client.Close();
Console.WriteLine("Closed");
//Record test1 = new Record("a", "b", 1, 200, "e", "f", "g", 2, 3, "j", "k");
}
public static Record ByteToStruct<Record>(byte[] data)
{
GCHandle gch = GCHandle.Alloc(data, GCHandleType.Pinned);
try
{
return (Record)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(Record));
}
finally
{
gch.Free();
}
}
運行這讓我:
「型 'System.AccessViolationException' 未處理的異常出現在mscorlib.dll
附加信息:試圖讀取或寫入受保護的內存。這通常是指示其他內存已損壞「
任何意見被廣泛讚賞,我是新來的C#
編輯:我忘了,包括記錄結構:
public Record(string a, string b, int c, string d, string e, string f, string g, int h, int i, string j, string k)
{
Console.WriteLine("inside struct 0");
Station = a;
UserName = b;
EvtActive = c;
EvtTime = d;
EvtTimeString = e;
LocCode = f;
LastLoop = g;
CompLvl = h;
RecordID = i;
ConnectTime = j;
Notes = k;
}
看起來像你在那裏複雜的事情。我認爲Record是你的結構?它有一個字節數組屬性?如果不是你做什麼不行。你需要給它一個屬性,這是一個字節[]來做到這一點,你不能只是魔術一個結構有其他類型的。一般而言,C#中的結構會被誤解/使用,您最好使用一個類。 – kmcc049
給它一個byte []屬性後我會做什麼?你是否說在構造函數中的所有變量都是byte []? – MrDysprosium