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;
}
...全文
1309 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
se7en 2011-09-07
  • 打赏
  • 举报
回复
socket唯一可以接受的方式就是byte[] 字节流 。至于深层的原因其实很简单 。不过我觉得没必要了解 。至于你为什么非要想用你的方式接受很是让人诧异
LIMINLY520 2011-09-07
  • 打赏
  • 举报
回复
观看观看……
雪晖 2011-07-20
  • 打赏
  • 举报
回复
我想要能够将报文用字符串的形式打印出来。
因为我想对比一下报文的内容
  • 打赏
  • 举报
回复
[Quote=引用楼主 xuehui8888 的回复:]
// 获得请求的字符串
//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];
}
[/Quote]
你这是啥代码?看不懂。

不管是GetString,还是 +=,你这是啥意思?为么要整到一个字符串变量msg里边去?人家发送之前的原始数据表示就是byte[],你接收之后也用byte[]表示数据,该干什么就干什么,为什么要用string来保存数据?
sugarbelle 2011-07-19
  • 打赏
  • 举报
回复
不管多少进制转换是不会丢数据的.

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧