V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Meli55a
V2EX  ›  程序员

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

  •  
  •   Meli55a · 2017-09-05 14:53:13 +08:00 · 1518 次点击
    这是一个创建于 2640 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题: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))
    

    处贴,大神轻点儿、、

    2 条回复    2017-09-05 16:56:31 +08:00
    Soar360
        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();
    }
    }
    }
    ```
    Soar360
        2
    Soar360  
       2017-09-05 16:56:31 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1203 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:19 · PVG 02:19 · LAX 10:19 · JFK 13:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.