На самом деле вы получаете правильные данные, но неправильно их интерпретируете ... и смешиваете некоторые понятия:
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');