Проблема Strtohex need fix (Решено)

Хамик

Старожил
В реестре имеется ключ типа binary такого вида: 70 30 FC B7 20 B3 E5 40.
Пытаюсь функцией StrToHex, перевести в аналогичный вид, но в string, но в результате получается такое: 703044CB72045643540.
Как перевести такой ключ из binary в string с сохранением структуры?
 

LexBell

Борода
Супер модератор
В реестре имеется ключ типа binary такого вида: 70 30 FC B7 20 B3 E5 40.
Пытаюсь функцией StrToHex, перевести в аналогичный вид, но в string, но в результате получается такое: 703044CB72045643540.
Как перевести такой ключ из binary в string с сохранением структуры?
code_language.pascal:
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
Uninstallable=no
CreateUninstallRegKey=no
OutputDir=.

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Code]
function HexToStr(str_hex: string): Ansistring;
var
  i: Integer;
begin
  Result:= '';
  StringChange(str_hex, ',', '');
  StringChange(str_hex, ' ','');// удаляем пробелы
  for i:= 1 to Length(str_hex) div 2 do
    Result:= Result +  Chr(StrToInt('$' + Copy(str_hex, (i-1)*2+1, 2)));
end;

function StrToHex(str: Ansistring): Ansistring;
var
  i: Integer;
begin
  Result:= '';
  for i:= 1 to Length(str) do
    Result:= Result +  Format('%.2x', [Ord(str[i]), Ord(str[i])]);
end;

function StrToHex2(str: Ansistring): Ansistring; //тут возвращаем пробелы
var
  i: Integer;
  S: string;
begin
  Result:= '';
  S := StrToHex(str);
  for i:=1 to Length(S) do
    if (i mod 2 = 0) then Result:= Result+S[i]+' ' else Result:= Result+S[i];
end;

procedure InitializeWizard;
var
  S: string;
begin
  S := HexToStr('70 30 FC B7 20 B3 E5 40');
  MsgBox(S, mbInformation, MB_OK);
  S := StrToHex2(S);
  MsgBox(S, mbInformation, MB_OK);
end;
 
Последнее редактирование:

Хамик

Старожил
@LexBell,функция StrToHex2 правильнее отрабатывает, получаю такое: 703044CB7204564354040. В функции вижу пробел, но он почему-то не сохраняется в результе и последний байт дублирует.

P.S. Как читается этот кусок "if (i mod 2 = 0) then"?
 

LexBell

Борода
Супер модератор
P.S. Как читается этот кусок "if (i mod 2 = 0) then"?
Проверяет на четность положения символа. в общем просто после каждого четного добавляю пробел. Обрати внимание, в
HexToStr тоже есть изменение, которое нужно для обратного преобразования
Чтобы не было пробела в конце, можно добавить условие, либо в конце образатть пробелы - Result := Trim(Result);
 

LexBell

Борода
Супер модератор
code_language.pascal:
function StrToHex2(str: Ansistring): Ansistring; //тут возвращаем пробелы
var
  i: Integer;
  S: string;
begin
  Result:= '';
  S := StrToHex(str);
  for i:=1 to Length(S) do
    if (i mod 2 = 0) and( i< Length(S)) then Result:= Result+S[i]+' ' else Result:= Result+S[i];
end;
или так
code_language.pascal:
function StrToHex2(str: Ansistring): Ansistring; //тут возвращаем пробелы
var
  i: Integer;
  S: string;
begin
  Result:= '';
  S := StrToHex(str);
  for i:=1 to Length(S) do
    if (i mod 2 = 0)  then Result:= Result+S[i]+' ' else Result:= Result+S[i];
  Result := Trim(Result);
end;
 
Сверху