c# 中处理流中的字符串 or ASCII?

2017-09-05 14:53:13 +08:00
 Meli55a

问题:c# 中处理流中的字符串 or ASCII ?

需求

http 服务端,处理 post 请求的数据,数据经过自定义加密表的 base64 加密,获取客户端 post 过来的经过加密的数据后,服务端解密,该数据中有客户端的 [软件名称] 、 [软件版本] 、 [时间] 、 [ CPU ID ] 等等,服务端需要提取这些数据并进行一些计算,后返回一个数据给客户端。现在问题是 c# 中如何提取这些数据,如何判断序列中字符的结尾?因为初学 c#,看了一些 MemoryStream 和 StreamReader 之类的文章,还是一头雾水,求指教。

说明

这是改的朋友写的一个 python 版本的程序,python 中是自定义了一个类似处理流的类,按顺序读取 python 中截取字符串是以判断当前字符是否为 “\x00 ”,目前是仿照 python 版本写了个类似的类,但我想 c# 是否有比较高级的处理方法。python 是用 Django 做服务端,现在不想用所以才改成 c# 的。

post 过来的数据解密后类似

\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))

处贴,大神轻点儿、、

1460 次点击
所在节点    程序员
2 条回复
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();
}
}
}
```
Soar360
2017-09-05 16:56:31 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/388323

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX