http 服务端,处理 post 请求的数据,数据经过自定义加密表的 base64 加密,获取客户端 post 过来的经过加密的数据后,服务端解密,该数据中有客户端的 [软件名称] 、 [软件版本] 、 [时间] 、 [ CPU ID ] 等等,服务端需要提取这些数据并进行一些计算,后返回一个数据给客户端。现在问题是 c# 中如何提取这些数据,如何判断序列中字符的结尾?因为初学 c#,看了一些 MemoryStream 和 StreamReader 之类的文章,还是一头雾水,求指教。
这是改的朋友写的一个 python 版本的程序,python 中是自定义了一个类似处理流的类,按顺序读取 python 中截取字符串是以判断当前字符是否为 “\x00 ”,目前是仿照 python 版本写了个类似的类,但我想 c# 是否有比较高级的处理方法。python 是用 Django 做服务端,现在不想用所以才改成 c# 的。
\x06\x00\x00\x00AABBCC Admin\x003.0\x00Jun 28 2017 at 16:26:47\x00\x001033\x0074689434\x006.2.9200 9\x002052.86.45\x00\x01\x00\x00\x00\x00\x80\x1a\x00\x14\xd2\x01\x00`\x97\xf2\x1b\x00\x00\x0020150429\x00FASPEED K5-120G\x00ZSYHOP518010400F30\xcd\x00\x00\x01\x00\x00\x00\x00
我现在需要按顺序提取字符串,如第一个值是:6,接着的 3 位为 0,就索引 +3,再取字符串,到 “\x00 ”,结束, “ AABBCC Admin ” 就是软件的名字,然后继续,问题是这个字符串的长度是没法预知的,像这种情况应该如何处理?
python 获取字符串的函数为:
def getString(self):
strBytes = []
for i in range(self.currentIndex, self.limit):
if self.inputBytes[i] != '\x00':
strBytes.append(self.inputBytes[i])
else:
self.currentIndex = i + 1
break
return str(bytearray(strBytes))
处贴,大神轻点儿、、
1
Soar360 2017-09-05 16:52:28 +08:00
NginxLogParser
``` public class NginxLogParser { /// <summary> /// 解析 Nginx 日志 /// </summary> /// <param name="log"></param> /// <returns></returns> /// <remarks> /// \x0A*,\x08\xD4\x98\x82*\xFF /// 拆分为: /// 0x0A /// * /// , /// 0x08 /// 0xD4 /// 0x98 /// 0x82 /// * /// 0xFF /// </remarks> public byte[] Parse(string log) { using (var ms = new MemoryStream()) { var state = 0; /* * 0:开始 * 1:转义符 * 2:x * 3:第一个数据位 * 4:第二个数据位 */ var buffer = new char[2]; foreach (var code in log) { switch (state) { case 0: { if (code == '\\') { state = 1; } else { ms.WriteByte((byte) code); } } break; case 1: { if (code == 'x') { state = 2; } else { throw new Exception("格式不正确"); } } break; case 2: { buffer[0] = code; state = 3; } break; case 3: { buffer[1] = code; ms.WriteByte(Convert.ToByte(new string(buffer), 16)); state = 0; //归零状态机 } break; } } return ms.ToArray(); } } } ``` |
2
Soar360 2017-09-05 16:56:31 +08:00 1
|