我用C#写的客户端,接收从POS机端发送过来的16进制报文,用byte方式接收,接收过来后,变成了10进制
报文里还缺少了不少的0,我想是不是可以直接接收过来就是16进制?这个要怎么做?因为我用10进制转换,里面已经丢失了部分数据,转换后的16进制,和原始报文已经部分不一致。
我的代码如下:
const int BufferSize = 8192;    // 缓存大小,8192字节
            
            Console.WriteLine("Server is running ... ");
            IPAddress ip = IPAddress.Parse(ConfigurationManager.AppSettings["ServerIP"]);
            TcpListener listener = new TcpListener(ip,Convert.ToInt32(ConfigurationManager.AppSettings["ServerPort"]));            listener.Start();  //开始监听
            Console.WriteLine("Start Listening...");            while (true)
            {
                // 获取一个连接,同步方法
                TcpClient remoteClient = listener.AcceptTcpClient();
                // 打印连接到的客户端信息
                Console.WriteLine("Client Connected!{0} <-- {1}",
                    remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);                // 获得流,并写入buffer中
                NetworkStream streamToClient = remoteClient.GetStream();
                byte[] buffer = new byte[BufferSize];
                int bytesRead = streamToClient.Read(buffer, 0, BufferSize);
                Console.WriteLine("Reading data, {0} bytes ...", bytesRead);
                // 获得请求的字符串
                //string msg = Encoding.UTF8.GetString(buffer);
                string msg = string.Empty;
                string msg2 = string.Empty;
                Console.Write("Receved:");                //报文全部转换成16进制
                for (int i = 0; i < bytesRead; i++)
                {
                    msg += buffer[i];
                    //Console.Write("{0}", buffer[i]);
                }
msg = t2h(msg);
//10进制转16进制
        static string t2h(string src)
        {
            /*src = src.Replace("0","00");
            string src2 = string.Empty;
            for (int i = 0; i < src.Length; i++)
            {
                if (i % 2 != 0) continue;
                if (src.Substring(i, 2) != "00")
                {
                    if (Convert.ToUInt32(src.Substring(i, 2)) >= 10)
                    {
                        src2 += Convert.ToString(Convert.ToUInt32(src.Substring(i, 2)), 16);
                    }
                    else
                    {
                        src2 += "0" + Convert.ToString(Convert.ToUInt32(src.Substring(i, 2)), 16);
                    }
                }
                else
                {
                    src2 += "00";
                }
            }
            return src2;*/
            string src2 = string.Empty;
            for (int i = 0; i < src.Length; i++)
            {
                if (i % 2 != 0) continue;
                src2 += Convert.ToString(Convert.ToInt32(src.Substring(i,2)),16);
            }
            return src2;
        }

解决方案 »

  1.   

    你这是啥代码?看不懂。不管是GetString,还是 +=,你这是啥意思?为么要整到一个字符串变量msg里边去?人家发送之前的原始数据表示就是byte[],你接收之后也用byte[]表示数据,该干什么就干什么,为什么要用string来保存数据?
      

  2.   

    socket唯一可以接受的方式就是byte[] 字节流 。至于深层的原因其实很简单 。不过我觉得没必要了解 。至于你为什么非要想用你的方式接受很是让人诧异