В Delphi 2010, как я могу преобразовать строку Unicode в шестнадцатеричную строку и обратно? - PullRequest
3 голосов
/ 23 ноября 2011

Я использую Delphi 2010, и мне нужно иметь возможность преобразовать строку в шестнадцатеричную строку, а затем позже иметь возможность преобразовать эту шестнадцатеричную строку обратно в исходную строку в Unicode.

Например,моя строка: Михаи́л Васи́льевич Ломоно́сов

Мне удалось использовать здесь фрагмент StringToHex16 Уоррена Р * (и я вставил фрагмент Уоррена ниже), чтобы преобразовать строку вшестнадцатеричная строка, но я не знаю, как преобразовать эту шестнадцатеричную строку обратно в исходную строку юникода.

function StringToHex16(str: string): string;
var
   i:integer;
   s:string;
begin
       s:='';

       for i:=1 to length(str) do begin
           s:=s+inttohex(Integer(str[i]),4);
       end;
       result:=s;

end;

Использование связанного StringToHex16 дает мне эту шестнадцатеричную строку:

041C04380445043004380301043B002004120430044104380301043B044C04350432043804470020041B043E043C043E043D043E03010441043E0432

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

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

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

function HexToString16(const str: string): string;
var
  i: Integer;
  code: string;
begin
  Result := '';
  i := 1;
  while i < Length(str) do begin
    code := Copy(str, i, 4);
    Result := Result + Chr(StrToInt('$' + code));
    Inc(i, 4);
  end;
end;

Эта функция предполагает, что ввод был сгенерирован StringToHex16 или чем-то эквивалентным. Если он не состоит из кратных четырем шестнадцатеричным цифрам, поведение не определено.

0 голосов
/ 23 ноября 2011

У меня есть эта рабочая функция, если хотите. Это не Unicode-осведомленный. Это может быть легко изменено, чтобы возвратить кусок

Function HexStringToBytes(Const Value: String): TBytes;
Var
  i, v: Integer;
  dg0, dg1: Byte;
  HexStr: String;
Begin
  HexStr := '';
  For i:= 1 To Length(Value) Do If Value[i] <> #32 Then HexStr := HexStr + Value[i];
  SetLength( Result, Length(HexStr) Div 2 );
  For i:= 1 To Length(HexStr) Div 2 Do
    Begin
      dg0 := 0;
      dg1 := 1;
      If TryStrToInt( '$' + HexStr[i*2 -1], v ) Then dg0 := Byte(v) Shl 4;
      If TryStrToInt( '$' + HexStr[i*2], v )    Then dg1 := Byte(v);
      Result[i-1] := dg0 + dg1;
    End;
End;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...