使用的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