Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Android] Преобразование HEX строки в String


tolstii

Вопрос

Добрый день.

Не могу побороть проблему с кодировкой в приложениях для Android

 

Пример задачи простой:

 

имею Hex string:   ed6a3e6589bd4536f36a7d5624757d9c  

 

который нужно преобразовать в string для дальнейших операций 

 

под windows все нормально: получаю íj>e‰½E6ój}V$u}œ  используя функцию:

 

function TForm1.HexToStr2(const source: string): string;
var
  i, idx:Cardinal;
  StrAsBytes:TBytes;
begin
  SetLength(StrAsBytes, length(source) div 2);
  i:=1;
  idx:=0;
  while i<=length(source) do
  begin
    StrAsBytes[idx]:=StrToInt('$'+source[i]+source[i+1]);
    i:=i+2;
    idx:=idx+1;
  end;
  result:=TEncoding.ansi.GetString(StrAsBytes);
end;
но вот под android получаю что угодно, но не это значение.
Понимаю что проблема в кодировки, перепробовал разное - безрезультатно.
 
Прошу помощи.

Прикрепляю исходник.
 
Спасибо!

MDD555.ZIP

Изменено пользователем Andrey Yefimov
Тег "Код" и правильный архив
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Как я и сказал: под Андроидом - string[0], в цикле - "-1"

Вот так:

function TForm1.HexToStr2(const source: string): string;
var
  i, idx: Cardinal;
  StrAsBytes: TBytes;
begin
  SetLength(StrAsBytes, length(source) div 2);
  i := 0;
  idx := 0;
  while i <= length(source) - 1 do
  begin
    StrAsBytes[idx] := StrToInt('$' + source[i] + source[i + 1]);
    i := i + 2;
    idx := idx + 1;
  end;

  result := tencoding.ansi.GetString(StrAsBytes);
end;

Если нужен один код на две ОС, то используйте директиву {$IFDEF}

Изменено пользователем Andrey Yefimov
Ссылка на комментарий
  • 0
  • Администраторы

Чтобы всегда работать со строками, как с 0-основными на всех платформах, достаточно использовать TStringHelper.

Для этого нужно:

  1. Подключить юнит: System.SysUtils.
  2. Использовать хелпер: Chars
function TForm1.HexToStr2(const Source: string): string;
var
  i, idx: Cardinal;
  StrAsBytes: TBytes;
begin
  SetLength(StrAsBytes, Length(source) div 2);
  i := 0;
  idx := 0;
  while i <= length(source) - 1 do
  begin
    StrAsBytes[idx] := StrToInt('$' + Source.Chars[i] + Source.Chars[i + 1]);
    i := i + 2;
    idx := idx + 1;
  end;

  result := TEncoding.ANSI.GetString(StrAsBytes);
end;
Ссылка на комментарий
  • 0

Добрый день, использовал вашу функцию в своем проекте, под Windows проблем нет, вссе замечательно, но вот под андроидом ругается на знак $, убирал его и вылетали ошибки о том что, например A1 не возможно перевести в инт, если вам не сложно, помогите юзеру.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...