Чтение данных с TCP indy 9 - PullRequest
       25

Чтение данных с TCP indy 9

0 голосов
/ 22 февраля 2011

в моем проекте мне нужно разработать сервер, принимающий кадры из GPRS / GPS Box, и декодировать эти кадры, чтобы извлечь соответствующие данные в виде широты, долготы и т. Д.

первая часть (TCP-соединение и получение данных) выполненапроблема, с которой я столкнулся, связана с декодированием данных, прошивка блока GPRS отправляет данные не в строковом формате, а в шестнадцатеричном формате, поэтому используемый мной метод (currentReaderBuffer) выводит фрейм в строковом формате, позвольте мне объяснить на реальном примере:

Данные, отправленные из GPRS BOX: 0d 0a 1f 52 данных, полученных с использованием currentReaderBuffer: # $ d # $ a # 1fR, проблема в том, как узнать, соответствует ли символ # $ d 0d или каждому из символов(#, $, d) соответствуют каждому коду ASCII

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

На самом деле вы получаете правильные данные, но неправильно их интерпретируете ... и смешиваете некоторые понятия:

Hex - это просто представление данных ... данные в компьютере являются двоичными, и компьютеры не понимают и не работают в шестнадцатеричном формате.

Вы решили представлять байт данных как символ, но вы можете рассматривать его как байт, и из этого выполнить шестнадцатеричное представление этих данных.

Например:

var
  aByte: Byte;
begin
  //ReceivedStr is the string variable where you hold the received data right now
  aByte := ReceivedStr[1];  
  //Warning! this will work only in pre-2009 Delphi versions
  ShowMessage('Hexadecimal of first byte: ' + IntToHex(aByte);
end;

или

 function StringToHex(const S: string): string;  //weird!
 begin
  //Warning! this will work only in pre-2009 delphi versions
   Result := '';
   for I := 1 to Length(Result) do
     Result := Result + IntToHex(Byte(S[I])) + ' ';
 end;

 function ReceiveData();
 begin
   //whatever you do to get the data...

   ShowMessage('Received data in hex: ' + StringToHex(ReceivedStr));
 end;

При этом ИМХО лучше рассматривать данные как двоичные с самого начала (целые числа, байты или любой другой подходящий тип), избегая использования строк. Время от времени вам будет легче, когда вы захотите перейти на современные версии Delphi, где строки - это Unicode.

В любом случае, вы можете захотеть обработать эти данные, я не думаю, что вы намерены показать их непосредственно пользователю.

Если вы хотите проверить, соответствует ли конкретный байт шестнадцатеричному значению, вы можете использовать обозначение $:

if aByte = $0d then
  ShowMessage('The hex value of the byte is 0d');
1 голос
/ 23 февраля 2011

#$d означает, что это символ (#) в шестнадцатеричном формате ($) со значением D (13), что означает возврат каретки. Если вы всегда получаете 1-байтовые значения (например, 0D или `1F '), вы можете быть уверены, что это шестнадцатеричные значения и конвертировать их.

Конвертировать их легко. Просто используйте их.

Например:

ShowMessage('You received hex 52, which is ' + #$52);
...