将不可显示的ASCII数组转换为十进制

1 c# ascii .net-cf-3.5

serial_port[4] {0x00, 0xA0, 0x05, 0xB1}从串口收到一个字节数组,如下所示:

string rec_data += sp.ReadExisting();  
Run Code Online (Sandbox Code Playgroud)

我需要使用以下命令将此字符串转换为十进制值:

byte[] Temp = Encoding.ASCII.GetBytes(rec_data);
decimal r0 = Convert.ToDecimal(Temp[0]);
decimal r1 = Convert.ToDecimal(Temp[1]);
decimal r2 = Convert.ToDecimal(Temp[2]);
decimal r3 = Convert.ToDecimal(Temp[3]); 
Run Code Online (Sandbox Code Playgroud)

但结果值不是我的愿望:

r0 = 0
r1 = 63
r2 = 5
r3 = 63

正如您所看到的,8位HEX值的结果是错误的并且等于63(0x3F)任何解决它的建议?

Lua*_*aan 5

ASCII是一个7位字符集.0xA0在ASCII中没有这样的东西.63恰好是?ASCII格式 - 当特定值无法在给定字符集中表示时使用的字符.

当数据不是字符时,不要将数据读取为字符数据.不要使用ReadExisting,它假设字符数据.相反,你需要这样的东西:

var buffer = new byte[256];
var bytesRead = sp.Read(buffer, 0, buffer.Length)

// buffer[0..bytesRead-1] now contains all the data read from the port
Run Code Online (Sandbox Code Playgroud)

当然,您可能需要多次读取以获取整个消息,或者您可能希望一次只读取有限数量的字节,具体取决于协议的工作方式.

SerialPort为您处理此问题的简单包装器可能如下所示:

class MySerialPort
{
  private readonly SerialPort _port;

  public MySerialPort(SerialPort port)
  {
    this._port = port;
  }

  public byte[] ReadBytes(int amount)
  {
    var data = new byte[amount];
    var offset = 0;

    while (amount > 0)
    {
      var bytesRead = _port.Read(data, offset, amount);
      offset += bytesRead;
      amount -= bytesRead;
    }

    return data;
  }
}
Run Code Online (Sandbox Code Playgroud)

根据您实际尝试的操作,您可能希望添加一些缓冲,但不会,但这对于通常在串行端口上使用的协议类型可以正常工作.如果这是你真正需要的,你可以简单地进行ReadBytes扩展方法SerialPort.

另外,decimal是一个十进制数.您可能想要使用byteint替代.