c#关于byte[]的基本问题
NetworkStreamnetStream=newNetworkStream(clientSocket);//通过socket接收数据byte[]datasize=ne...
NetworkStream netStream = new NetworkStream(clientSocket);//通过socket接收数据
byte[] datasize = new byte[4];//读取了长度为4的数据
netStream.Read(datasize, 0, 4);//?
int size = System.BitConverter.ToInt32(datasize, 0);//哪里的数据转化为int?
Byte[] message = new byte[size];
int dataleft = size;//这里为什么要赋值给dataleft 不能直接用size?
int start = 0;
while (dataleft > 0)
{
int recv = netStream.Read(message, start, dataleft);//?
start += recv;
dataleft -= recv;
}
--------------------
以上代码不明白 请逐句给予指点。如果是需要接收TLV形式的数据 即要先得到表示数据长度的数据 该怎么写? 展开
byte[] datasize = new byte[4];//读取了长度为4的数据
netStream.Read(datasize, 0, 4);//?
int size = System.BitConverter.ToInt32(datasize, 0);//哪里的数据转化为int?
Byte[] message = new byte[size];
int dataleft = size;//这里为什么要赋值给dataleft 不能直接用size?
int start = 0;
while (dataleft > 0)
{
int recv = netStream.Read(message, start, dataleft);//?
start += recv;
dataleft -= recv;
}
--------------------
以上代码不明白 请逐句给予指点。如果是需要接收TLV形式的数据 即要先得到表示数据长度的数据 该怎么写? 展开
3个回答
展开全部
因为dataleft是一个变化的值,size可能在其它地主还会用上,直接用有可能会造成不可预知的错误
NetworkStream netStream = new NetworkStream(clientSocket);//通过socket接收数据
byte[] datasize = new byte[4];//设置一个4字节的缓冲
netStream.Read(datasize, 0, 4);//读取4字节数据
int size = System.BitConverter.ToInt32(datasize, 0);//将读取的4字节数据转化为缓冲区大小
Byte[] message = new byte[size];//设置size大小的缓冲区
int dataleft = size;//定义过程变量
int start = 0;//定义开始点
while (dataleft > 0)//一直读取直至dataleft==0;
{
int recv = netStream.Read(message, start, dataleft);//读取数据,recv表示读取到的数据量
start += recv;//设置开始点的start
dataleft -= recv;//将总数据量减去已读取数据
}
NetworkStream netStream = new NetworkStream(clientSocket);//通过socket接收数据
byte[] datasize = new byte[4];//设置一个4字节的缓冲
netStream.Read(datasize, 0, 4);//读取4字节数据
int size = System.BitConverter.ToInt32(datasize, 0);//将读取的4字节数据转化为缓冲区大小
Byte[] message = new byte[size];//设置size大小的缓冲区
int dataleft = size;//定义过程变量
int start = 0;//定义开始点
while (dataleft > 0)//一直读取直至dataleft==0;
{
int recv = netStream.Read(message, start, dataleft);//读取数据,recv表示读取到的数据量
start += recv;//设置开始点的start
dataleft -= recv;//将总数据量减去已读取数据
}
展开全部
要序列化一个对象,首先设置该对象类是可以序列化的,然后序列化为二进制或XML数据。
你的方法是没问题的,goorcome说得对,只能序列化实例。另外你的类声明没有说明可序列化。
[Serializable()]
class LeafClassDataPack
{
public string a;
public int b;
public byte[] c;
}
下面是测试代码:
private void button3_Click(object sender, EventArgs e)
{
LeafClassDataPack lcdp= DeserializeMyClass(SerializeMyClass());
Text = lcdp.a;
}
private byte[] SerializeMyClass()
{
LeafClassDataPack leafClassDataPack=new LeafClassDataPack();
leafClassDataPack.a = "test";
byte[] leafMyClassByteTemp;
MemoryStream leafMemoryStreamTemp = new MemoryStream();
BinaryFormatter leafBinaryFormatterTemp = new BinaryFormatter();
leafBinaryFormatterTemp.Serialize(leafMemoryStreamTemp, leafClassDataPack);
leafMyClassByteTemp = leafMemoryStreamTemp.GetBuffer();
return leafMyClassByteTemp;
}
private LeafClassDataPack DeserializeMyClass(byte[] leafMyClassByteTemp)
{
LeafClassDataPack leafClassDataPack;
BinaryFormatter leafBinaryFormatterTemp = new BinaryFormatter();
leafClassDataPack = (LeafClassDataPack)leafBinaryFormatterTemp.Deserialize(new MemoryStream(leafMyClassByteTemp));
return leafClassDataPack;
}
你的方法是没问题的,goorcome说得对,只能序列化实例。另外你的类声明没有说明可序列化。
[Serializable()]
class LeafClassDataPack
{
public string a;
public int b;
public byte[] c;
}
下面是测试代码:
private void button3_Click(object sender, EventArgs e)
{
LeafClassDataPack lcdp= DeserializeMyClass(SerializeMyClass());
Text = lcdp.a;
}
private byte[] SerializeMyClass()
{
LeafClassDataPack leafClassDataPack=new LeafClassDataPack();
leafClassDataPack.a = "test";
byte[] leafMyClassByteTemp;
MemoryStream leafMemoryStreamTemp = new MemoryStream();
BinaryFormatter leafBinaryFormatterTemp = new BinaryFormatter();
leafBinaryFormatterTemp.Serialize(leafMemoryStreamTemp, leafClassDataPack);
leafMyClassByteTemp = leafMemoryStreamTemp.GetBuffer();
return leafMyClassByteTemp;
}
private LeafClassDataPack DeserializeMyClass(byte[] leafMyClassByteTemp)
{
LeafClassDataPack leafClassDataPack;
BinaryFormatter leafBinaryFormatterTemp = new BinaryFormatter();
leafClassDataPack = (LeafClassDataPack)leafBinaryFormatterTemp.Deserialize(new MemoryStream(leafMyClassByteTemp));
return leafClassDataPack;
}
追问
。。。。你确定你是来回答我的问题的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不明白一楼为何重点说的是序列化!楼主问的是网络流的问题啊!
我大致按照楼主的意思解释下吧,可能有不准确的地方!
首先接收网络流,
netStream.Read(datasize, 0, 4);//?
读取前四个字节的信息!并将信息存在字节数组datasize中!
然后根据接收的字节数创建一个字节数组!
Byte[] message = new byte[size];这样的目的一般是根据实际应用情况而定的!比如聊天,可能在前几个字节表示特殊的含义!所以根据接收的前几个字节的长度来定这个字节数组!
然后就是循环接收来自网络流下面的信息!并存储在message中!
int dataleft = size;之所以这样,是因为这个长度是不固定的,size最长为4,但是可能接收的为2等!
我大致按照楼主的意思解释下吧,可能有不准确的地方!
首先接收网络流,
netStream.Read(datasize, 0, 4);//?
读取前四个字节的信息!并将信息存在字节数组datasize中!
然后根据接收的字节数创建一个字节数组!
Byte[] message = new byte[size];这样的目的一般是根据实际应用情况而定的!比如聊天,可能在前几个字节表示特殊的含义!所以根据接收的前几个字节的长度来定这个字节数组!
然后就是循环接收来自网络流下面的信息!并存储在message中!
int dataleft = size;之所以这样,是因为这个长度是不固定的,size最长为4,但是可能接收的为2等!
追问
那请问要是我定义的消息格式是
[表示类型(占2字节)+表示后面的消息长度(占4字节)+数据(不定长)]
这样的话是不是这么写:
NetworkStream netStream = new NetworkStream(clientSocket);
byte[] datasize = new byte[2];
//然后是读取接收到的前面2个字节表示的类型转到具体定义,这里怎么继续接收后面的表示长度的4字节呢?还需要NetworkStream netStream = new NetworkStream(clientSocket);这样么?
追答
不是!读取前俩字节是这样的!但是读取后续四个自己时,可以直接read网络流netstream的从2到6的位置的字节!然后循环读取此后所有自己!再然后根据存储字节的数组进行转换相应的编码就可以!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询