关于C#:如何将端口上接收的字节转换回字符串?


How can I convert bytes received on a port back to string?

本问题已经有最佳答案,请猛点这里访问。

我有一些这样的代码,它将串行端口数据存储到一个名为buffer的int数组中现在我想让缓冲区把它转换成字符串形式。我该怎么做?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        //if (cCommon.DecryptText(CallerId) =="enable")
        //{
        if (buffer.Length > 0)
        {
            try
            {
                for (int c = 0; c != serialPort.BytesToRead; c++)
                {
                    buffer[pointer] = serialPort.ReadByte();
                    pointer++;
                }
            }
            catch (TimeoutException x)
            {
                //BackgroundWorker bw = new BackgroundWorker();



                bw = new BackgroundWorker();
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                bw.RunWorkerAsync();
            }
        }
        // }
        //else
        //{
        //    MessageBox.Show("You do not have permission to use This feature serialPort","Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //}
    }


我不确定确切的解决方案,因为它取决于您正在通信的设备,但我可以建议以下方法。首先读取字节,然后应该使用字节数组而不是整数数组。你想读的数字并不意味着你应该使用整数(数字?)。我想您可能应该有ASCII字符,所以您应该使用该转换,但这是您自己应该看到的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
byte[] buffer = new byte[255];
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
      try
      {
         for (int c = 0; pointer+c < buffer.Length && c < serialPort.BytesToRead; c++)
         {
            buffer[pointer++] = (byte)serialPort.ReadByte();
         }
      }
      catch
      {
          MessageBox.Show("Error reading port!");
      }
}
.
.
.
//and then you convert what you have read with something like this:

System.Text.Encoding.ASCII.GetString(buffer);

但请记住,您正在转换那里的整个255字节,而读取的字符可能更少。因此,您可能应该修改从端口读取的代码。


请参见encoding.getString()。如果整数数组可以解析为字节数组,并且您知道编码,那么您应该能够执行如下操作:

1
Encoding.UTF8.GetString(buffer)

…将整数数组转换为字节数组之后。