C# SOCKET直接接收16进制数据
雪晖 2011-07-19 10:10:23 我用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;
}