【问题标题】:Reading necessary bytes读取必要的字节
【发布时间】:2015-08-16 03:15:09
【问题描述】:

是否可以只读取字符串的最后两个字节。例如,我从流套接字接收 41 0C 34,我只需要 34。我可以通过什么方式做到这一点。这是我的代码:

   public string ReadSensor(ISensor sensor)
    {

        if (ConnectedPort == null)
            return null;
        if (client.Connected)
        {

            string PIDhex = (sensor.GetValue(this)).ToString("x2"); ;

           string PID = Convert.ToString("01"+PIDhex+"\r");

           byte[] byteAir = System.Text.Encoding.ASCII.GetBytes(Convert.ToString(PID));

           stream.Write(byteAir, 0, byteAir.Length);

           byte[] MessageProt = new byte[8];
           stream.Read(MessageProt,0,MessageProt.Length);
           var str = System.Text.Encoding.ASCII.GetString(MessageProt);

           string output = Convert.ToString(str);
           return output;
           }

注意:我只需要 34,因为我需要将其转换为十进制值,然后将其实现为等式。谢谢:)

【问题讨论】:

  • 字符串有字符;流有字节;字符串可以编码为字节,但除非您首先定义编码,否则两者之间没有直接映射;目前尚不清楚您想在这里做什么 - 您可以 skip 字节(通过读取它们但不处理它们),但除非您至少缓冲,否则您无法获得“最后 n”字节n 个字节(大概在一个循环缓冲区中)并等到你到达流的末尾
  • 顺便说一句:您的阅读代码不安全;您可以读取 1 个字节、0 个字节,以及不超过 MessageProt.Length 字节的任何内容;您可能已经收到了一半的逻辑消息,而另一半仍在途中(拆分数据包、缓冲区等) - 基本上:如果您需要,这不是与套接字通信的方式稳健地工作
  • 不幸的是,当我尝试在第二个读取流操作中读取时,某些字节会混淆或无法正确显示。我正在尝试一种不同的方法,如下所示:

标签: c# string byte elm327


【解决方案1】:

您不能只是从套接字中“不读取”字节。

因此,阅读整个字符串并按照Extract only right most n letters from a string 中的说明选择所需的字符:

string lastTwo = input.Substring(input.Length - 2);

但是作为Marc points out in the comments,您的阅读代码将无法正常工作。这是一个巧合,它现在有效,但它可能会失败。请参阅What does Filestream.Read return value mean? How to read data in chunks and process it? 以调用Read(),直到您读取到您期望的字节数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多