使⽤C#实现Pythonstruct.pack和unpack函数
使⽤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>
6public string Dec2HexStream(int size)
7    {
8
9string raw = "00000000";
10string hex = Convert.ToString(size, 16);
11//Console.WriteLine("转换字符串 " + hex + " 长度 " + hex.Length);
12int hexLen = hex.Length;
13if (hexLen > 8)
14return"\x00\x00\x00\x00";
15else
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
22string res = "";
23for (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 = "";
31for (int i = 0; i < 4; i++)
32        {
33            res += "\\x" + hex.Substring(i * 2, 2);
34        }
35//Console.WriteLine("结果字符串 " + res);
36return 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>
6public 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);
13string tmp = "";
14for (int i = 3; i >= 0; i--)
15        {
16            UInt32 m = Convert.ToUInt32(s[i]);
17string hexs = Convert.ToString(m, 16);
18            tmp += hexs;
19        }
20//Console.WriteLine("还原字符串 " + tmp + " 长度 " + (tmp.Length).ToString());
21        res = Convert.ToUInt32(tmp, 16);
22return (int)res;
23    }
writeline函数本⽂⾸发、修改于

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。