2015-06-02 5 views
0

можно читать только последние два байта из строки. Например, я получаю 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, как мне нужно, чтобы преобразовать его в десятичное значение и чем реализовать его в уравнение. спасибо :)

+0

строки имеют символы; потоки имеют байты; строки могут быть * закодированы * в байтах, но между ними нет прямой карты, если вы не сначала определите кодировку; неясно, что вы хотите здесь сделать - вы можете * пропустить * байты (читая их, но не обрабатывая их), но вы не можете получить байты «last n», если вы не буферируете не менее n байтов (предположительно в круговой буфер) и дождитесь, пока вы не дойдете до конца потока –

+1

Кстати: ваш код чтения небезопасен; вы могли бы прочитать 1 байт, 0 байт, что угодно до байтов MessageProt.Length'; вы могли бы получить половину логического сообщения, а другая половина по-прежнему находится на маршруте (разделенные пакеты, буферы и т. д.) - в основном: это ** не **, как вы разговариваете с сокетом, если хотите, чтобы он работал надежно –

+0

К сожалению, я пришел к выводу, что когда я пытаюсь читать во второй операции чтения, некоторые байты путаются или не отображаются правильно. Я пытаюсь использовать различный подход, который можно увидеть ниже: – Albzoq

ответ

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(), пока вы не прочитаете количество ожидаемых байтов.

Смежные вопросы