日期:2014-05-18  浏览次数:20899 次

混合byte[]如何解析出来?就是byte[]里写入了int,string等
写入端socket.send(Encoding.UTF8.GetBytes("dfdff\0");接收对应用的GetString能正确解析出来,加入Int后为什么解析不出来了呢?
写入端:
byte[] bta1 = BitConverter.GetBytes(1001);
byte[] bta2 = BitConverter.GetBytes(0);
byte[] bta = Encoding.UTF8.GetBytes("dfdfdfdf\0");
socket.send(ByteConnector.concat(bta1,bta2,bta);
接收端:
ByteArray bta = new ByteArray(receivedByte);
int test1 = bta.ReadInt();
int test2 = bta.ReadInt();
int test3 = bta.ReadUTF();其中ByteConnector和ByteArray是自己写的类,我也怀疑这类有问题,就不上类代码了,帮助大家理解我的意图就是了,怎么解决?谢谢大家先!

------解决方案--------------------
没办法判断哪些字节是字符哪些是int数值吧。
可以考虑加上两个特殊的值作标记,一个指示后面的字节是字符,一个指示为数值
------解决方案--------------------
C# code
byte[] bta1 = BitConverter.GetBytes(1001);
byte[] bta2 = BitConverter.GetBytes(0);
byte[] bta = Encoding.UTF8.GetBytes("dfdfdfdf\0");
Console.WriteLine(BitConverter.ToInt32(bta1, 0));
Console.WriteLine(BitConverter.ToInt32(bta2, 0));
Console.WriteLine(Encoding.UTF8.GetString(bta));

------解决方案--------------------
个人认为,虽然混合在一起节省空间,但处理和维护不容易,因为还要考虑著名的“粘包”问题、传输发生错误等问题。因此,这种设计需要改进,同意1楼的观点。
设计与编写程序,不是技巧上取胜,而是方法和思路为王。
------解决方案--------------------
要不然就是固定格式的,例如1-3字节为int型,4-8字节为string型,等等,直接根据byte是无法判断存储哪种类型的,因为所有信息都是以byte存储、传输的,
再不然就是上面说的加特殊标志
------解决方案--------------------
数字先发送,到接收端,先行把头几个字节截取,然后把余下再组成字符 串
------解决方案--------------------
知道结构是不是可以按byte来读阿,数字就按原样,string就encoding转化一下~
------解决方案--------------------
数字必须知道它存放的位置和类型,string必须知道它存放的位置和长度
这样才可以解析出来
------解决方案--------------------
业务上一定要分清数值和字符串吗? 那恐怕不好办。
全转成string再传。
------解决方案--------------------
你的根据你的 ByteConnector来按BYTE读数据~~
------解决方案--------------------
/// <summary>
/// 快速复制内存,可用于强行的类型转换,必须非安全(unsafe{})块中使用,非必要,不建议使用。
/// </summary>
/// <param name="Destination">目标对象的指针</param>
/// <param name="Source">源对象的指针</param>
/// <param name="Length">要复制的长度(单位:字节)</param>
[DllImport("kernel32.dll", CharSet = CharSet.Auto, EntryPoint = "RtlMoveMemory", CallingConvention = CallingConvention.StdCall)]
public static unsafe extern void CopyMemory(void* Destination, void* Source, int Length);