使用C#实现具体场景下的 Python struct.pack 和unpack函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用C#实现具体场景下的 Python struct.pack 和unpack函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2939字,纯文字阅读大概需要5分钟。
内容图文
![使用C#实现具体场景下的 Python struct.pack 和unpack函数](/upload/InfoBanner/zyjiaocheng/629/383a99460bb748a2bf9ddca5dcf8fac3.jpg)
使用C#来模拟python pack和unpack函数的效果的需求来自一次作业,作业做一个联网的射击游戏,那么不可避免地要进行服务端和客户端地交互,但是服务端代码由Python编写,而客户端代码由C#完成,并且服务端发送数据又经过pack打包,这样一来,客户端就需要去解析收到的数据,然而没有对应的库或者函数可以用(又或者我没有找到),所以我根据我的使用场景来实现了打包和解包的函数。本来不打算发出来,因为没有经过严格的测试(又或者说只适用于我这里的问题),但如果你也有类似的问题,不妨看一看,可能会有启发。
我的使用场景:
服务端向客户端发送数据时,使用包头+data的方式来避免粘包。首先把计算数据和包头长度,而后将其pack成字符串,与data组合一并发送至客户端,由客户端进行解析。
pack format:4 bytes little endian (x86) by default
我观察打印的的结果后,实现了c#端的对应打包解包函数如下:
C# - pack (pack之后是一个16进制串,需要把一个整数转换成一个4字节小端,即低位存储在低字节的16进制字符串)
1 /// <summary> 2 /// format the dec integer to a hex stream, for sending msg 3 /// </summary> 4 /// <param name="size"> dec integer </param> 5 /// <returns> hex stream </returns> 6 public string Dec2HexStream(int size) 7 { 8 9 string raw = "00000000"; 10 string hex = Convert.ToString(size, 16); 11 //Console.WriteLine("转换字符串 " + hex + " 长度 " + hex.Length); 12 int hexLen = hex.Length; 13 if (hexLen > 8) 14 return "\x00\x00\x00\x00"; 15 else 16 { 17 // 100 -> 00 01 00 00 -> 00 00 01 00 18 hex = raw.Substring(0, 8 - hexLen) + hex; 19 } 20 //Console.WriteLine("加0字符串 " + hex); 21 22 string res = ""; 23 for (int i = 3; i >= 0; i--) 24 { 25 res += hex.Substring(i * 2, 2); 26 } 27 hex = res; 28 29 //Console.WriteLine("反转字符串 " + hex); 30 res = ""; 31 for (int i = 0; i < 4; i++) 32 { 33 res += "\\x" + hex.Substring(i * 2, 2); 34 } 35 //Console.WriteLine("结果字符串 " + res); 36 return Regex.Unescape(res); 37 }
C# - unpack (对应的将4字节小端存储的16进制字符串转换成为一个整数)
1 /// <summary> 2 /// for recving msg and parsering the size of data 3 /// </summary> 4 /// <param name="s"> hex stream </param> 5 /// <returns>dec integer</returns> 6 public int HexStream2Dec(string s) 7 { 8 // 00 01 00 00 9 // 00 00 01 00 10 // \x01\x00\x00\x00 小端 11 UInt32 res = 0; 12 //Console.WriteLine("处理字符串 " + s); 13 string tmp = ""; 14 for (int i = 3; i >= 0; i--) 15 { 16 UInt32 m = Convert.ToUInt32(s[i]); 17 string hexs = Convert.ToString(m, 16); 18 tmp += hexs; 19 } 20 //Console.WriteLine("还原字符串 " + tmp + " 长度 " + (tmp.Length).ToString()); 21 res = Convert.ToUInt32(tmp, 16); 22 return (int)res; 23 }
本文首发、修改于 博客园 yocichen
内容总结
以上是互联网集市为您收集整理的使用C#实现具体场景下的 Python struct.pack 和unpack函数全部内容,希望文章能够帮你解决使用C#实现具体场景下的 Python struct.pack 和unpack函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。