昨天问了截取报文的问题,CSDN上的朋友帮解答了,十分感谢。
可是问题也随之而来。截取到了报文byte[],就要把byte[]转换成string进行解析,我用了3种方法转换:
下文中的myByte是个byte[].
1,string str = Convert.ToBase64String(myByte);
其转换结果是:RQAEv01IQACABnBzwAIB6z2BOQ8I8QBQMoAeRRTjvuNQGP//PS8AAEdFVCAvdGhyZWFkLnBocD......后省略一大串,根本无法解读,看起来像MD5加密的东西,但是我们的网站和我的WebService报文都没有加密
2,string str = BitConverter.ToString(ReceiveClass.PackByte);
其转换的结果是:45-00-00-28-55-B0-40-00-80-06-F5-78-C0-02-01-EB-D3-64-1A-55-09-......后省略一大串
3,string str = Encoding.UTF8.GetString(ReceiveClass.PackByte);其结果更诡异,如果用文本框显示则只有一个"E";如果放到WebBrowser控件中则可以看到:
EFX$@�����I�` vP^5 ��|�jP���GET /common/images/default/menu_mouseover.jpg HTTP/1.1 Accept: */* Referer: http:/......省略一大串,而且感觉后面的HTML也不全,照理我应该拿到XML特求教怎么样来转换这个myByte来得到我想要的报文。

解决方案 »

  1.   

    当年你怎么把它从字符串转成byte[]的,现在就还用同一种方式转回去如ASCII,或UTF8,或Unicode等System.Text命名空间下有对应的转换器,使用GetString()方法得到字符串把你当时如何转成byte[]的搞清楚即可
      

  2.   

    试试这个:
    string str = Encoding.GetEncoding("GB18030").GetString(ReceiveClass.PackByte);
      

  3.   

    还是和UTF8一样的结果。
    会不会是截取类的问题,
    我把截取的方法贴在下面,求指教和指正 using System;
    using System.Net;
    using System.Net.Sockets;namespace SocketTry
    {
        class MyRawSocket
        {
            private IPAddress MyIP;
            private bool RunRawSocket = false;
            private readonly Socket MySocket;        public MyRawSocket(IPAddress MyIPAddress)
            {
                MyIP = MyIPAddress;            MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
                MySocket.Blocking = false;
                MySocket.Bind(new IPEndPoint(MyIPAddress, 0));            if (SetSocketIOControl() == false) return;
                RunRawSocket = true;
            }        private bool SetSocketIOControl()
            {
                bool ReturnBool = true;
                try
                {
                    MySocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
                    var InByte = new byte[4] { 1, 0, 0, 0 };
                    var OutByte = new byte[4];
                    var SIO_RCVALL = unchecked((int)0x98000001);
                    int ScoketCode = MySocket.IOControl(SIO_RCVALL, InByte, OutByte);
                    ScoketCode = OutByte[0] + OutByte[1] + OutByte[2] + OutByte[3];
                    if (ScoketCode != 0) ReturnBool = false;
                }
                catch (SocketException)
                {
                    ReturnBool = false;
                }
                return ReturnBool;
            }        public void Star()
            {
                var Temp = new byte[0];
                IAsyncResult StarAsyncResult = MySocket.BeginReceive(Temp, 0, 0, SocketFlags.None, new AsyncCallback(CallReceive), MySocket);
            }
            public void Stop()
            {
                RunRawSocket = false;
            }        private void CallReceive(IAsyncResult ar)
            {
                var sock = (Socket)ar.AsyncState;
                int ReceiveCount = sock.Available;            if (ReceiveCount != 0)
                {
                    var Data = new byte[ReceiveCount];
                    sock.Receive(Data);
                    AssayByte(Data);
                }
                if (RunRawSocket) Star();
            }        /// <summary>
            /// 分析数据
            /// </summary>
            /// <param name="Data"></param>
            private void AssayByte(byte[] Data)
            {
                var MyData = new IPData();
                if (Data.Length >= 24)
                {                MyData.HeaderLength = (uint)(Data[0] & 0x0F) << 2;                MyData.Version = (uint)(Data[0] & 0xF0) >> 4;                switch (Data[9])
                    {
                        case 1: MyData.Protocol = "ICMP"; break;
                        case 2: MyData.Protocol = "IGMP"; break;
                        case 6: MyData.Protocol = "TCP"; break;
                        case 17: MyData.Protocol = "UDP"; break;
                        default: MyData.Protocol = "UNKNOWN"; break;
                    }                MyData.OriginationAddress = new IPAddress(new byte[] { Data[12], Data[13], Data[14], Data[15] });
                    MyData.DestinationAddress = new IPAddress(new byte[] { Data[16], Data[17], Data[18], Data[19] });                MyData.OriginationPort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(new byte[] { Data[20], Data[21] }, 0));
                    MyData.DestinationPort = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(new byte[] { Data[22], Data[23] }, 0));                MyData.PacketLength = (uint)Data.Length;
                    MyData.MessageLength = (uint)Data.Length - MyData.HeaderLength;                MyData.PackByte = Data;
                }
                else
                {
                    MyData.PackByte = Data;
                }
                if (Receive != null) Receive(MyData);
            }        public delegate void ReceiveData(IPData ReceiveClass);
            public event ReceiveData Receive;        public class IPData
            {
                private string _Protocol = "";            /// <summary>
                /// IP头长度
                /// </summary>
                public uint HeaderLength { get; set; }            /// <summary>
                /// IP版本
                /// </summary>
                public uint Version { get; set; }            /// <summary>
                /// IP协议
                /// </summary>
                public string Protocol { get { return _Protocol; } set { _Protocol = value; } }            /// <summary>
                /// 发送IP地址
                /// </summary>
                public IPAddress OriginationAddress { get; set; }            /// <summary>
                /// 接收IP地址
                /// </summary>
                public IPAddress DestinationAddress { get; set; }            /// <summary>
                /// 发送端口
                /// </summary>
                public short OriginationPort { get; set; }            /// <summary>
                /// 接收端口
                /// </summary>
                public short DestinationPort { get; set; }            /// <summary>
                /// 接收长度
                /// </summary>
                public uint PacketLength { get; set; }            /// <summary>
                /// 消息长度
                /// </summary>
                public uint MessageLength { get; set; }            /// <summary>
                /// 包数据
                /// </summary>
                public byte[] PackByte { get; set; }
            }    }
    }