Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Преобразование ASCII в шестнадцатиричное представление

Delphi , Синтаксис , Преобразования

Преобразование ASCII в шестнадцатиричное представление

Строка представляет собой массив байтов в виде ASCII-символов. Необходимо организовать преобразование типов по аналогии с Delphi-функциями Ord и Chr.

Функция BytesToHexStr преобразует, к примеру, набор байтов [0,1,1,0] в строку '30313130', HexStrToBytes выполнит обратное преобразование.


unit Hexstr;

interface
uses String16, SysUtils;

type

  PByte = ^BYTE;

procedure BytesToHexStr(var hHexStr: string; pbyteArray: PByte; InputLength:
  WORD);

procedure HexStrToBytes(hHexStr: string; pbyteArray: Pointer);
procedure HexBytesToChar(var Response: string; hexbytes: PChar; InputLength:
  WORD);

implementation

procedure BytesToHexStr(var hHexStr: string; pbyteArray: PByte; InputLength:
  WORD);
const

  HexChars: array[0..15] of Char = '0123456789ABCDEF';
var

  i, j: WORD;
begin

  SetLength(hHexStr, (InputLength * 2));
  FillChar(hHexStr, sizeof(hHexStr), #0);
  j := 1;
  for i := 1 to InputLength do
  begin
    hHexStr[j] := Char(HexChars[pbyteArray^ shr 4]);
    inc(j);
    hHexStr[j] := Char(HexChars[pbyteArray^ and 15]);
    inc(j);
    inc(pbyteArray);
  end;
end;

procedure HexBytesToChar(var Response: string; hexbytes: PChar; InputLength:
  WORD);
var

  i: WORD;
  c: byte;
begin

  SetLength(Response, InputLength);
  FillChar(Response, SizeOf(Response), #0);
  for i := 0 to (InputLength - 1) do
  begin
    c := BYTE(hexbytes[i]) and BYTE($F);
    if c > 9 then
      Inc(c, $37)
    else
      Inc(c, $30);
    Response[i + 1] := char(c);
  end; {for}
end;

procedure HexStrToBytes(hHexStr: string; pbyteArray: Pointer);
{pbyteArray указывает на область памяти, хранящей результаты}
var

  i, j: WORD;
  tempPtr: PChar;
  twoDigits: string[2];
begin

  tempPtr := pbyteArray;
  j := 1;
  for i := 1 to (Length(hHexStr) div 2) do
  begin
    twoDigits := Copy(hHexStr, j, 2);
    Inc(j, 2);
    PByte(tempPtr)^ := StrToInt('$' + twoDigits);
    Inc(tempPtr);
  end; {for}
end;

end.



unit String16.
interface
{$IFNDEF Win32}

procedure SetLength(var S: string; Len: Integer);
procedure SetString(var Dst: string; Src: PChar; Len: Integer);
{$ENDIF}
implementation
{$IFNDEF Win32}

procedure SetLength(var S: string; Len: Integer);
begin
  if Len > 255 then
    S[0] := Chr(255)
  else
    S[0] := Chr(Len)
end;

procedure SetString(var Dst: string; Src: PChar; Len: Integer);
begin
  if Len > 255 then
    Move(Src^, Dst[1], 255)
  else
    Move(Src^, Dst[1], Len);
  SetLength(Dst, Len);
end;
{$ENDIF}
end.

Анализ кода:

Модули В коде есть два модуля: Hexstr и String16. Модуль Hexstr содержит три процедуры для конвертации между строками ASCII и массивами байтов в hexadecimal формате. Модуль String16 предлагает вспомогательные процедуры для работы с строками, конкретно для установки длины и содержимого строки.

Процедуры 1. BytesToHexStr: Конвертирует массив байтов в строку hexadecimal представления. * Он проходит по входному массиву байтов, конвертируя каждый байт в два символа (цифровой символ hexadecimal) с помощью массива HexChars. * Результатная строка hexadecimal хранится в параметре выхода hHexStr. 2. HexStrToBytes: Конвертирует строку hexadecimal в массив байтов. * Он проходит по входной строке hexadecimal, извлекая каждый парный символ и конвертируя его в байт с помощью функции StrToInt с основанием 16. * Результатный массив байтов хранится в параметре выхода pbyteArray. 3. HexBytesToChar: Конвертирует массив hexadecimal байтов в строку ASCII представления. * Он проходит по входному массиву байтов, конвертируя каждый байт в символ с помощью массива HexChars и некоторых простых арифметических операций. * Результатная строка ASCII хранится в параметре выхода Response.

Замечания

  • Код использует синтаксис Delphi, с псевдокодом языка Pascal, включая процедуры, переменные и массивы.
  • Тип PByte используется для представления указателя на байт (8-битное целое число).
  • Массив HexChars используется для маппинга цифр hexadecimal к соответствующим символам ASCII.
  • Процедура SetLength в модуле String16 используется для установки длины строки, а процедура SetString - для копирования данных из одной строки в другую.

Рекомендации 1. Добавьте более подробные комментарии и документацию, чтобы объяснить цель и поведение каждой процедуры. 2. Используйте более описательные имена переменных, чтобы улучшить читаемость кода. 3. Если это возможно, рассмотрите использование встроенных функций Delphi для манипуляции строками вместо реализации своих собственных процедур. 4. Процедура HexBytesToChar может быть оптимизирована с помощью использования одиночной цикла вместо двух вложенных циклов.

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

Преобразование ASCII-символов в шестнадцатиричное представление и обратно позволяет использовать функции BytesToHexStr, HexStrToBytes и HexBytesToChar для работы с байтовыми данными в строковом виде.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Преобразования ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 03:02:41/0.0036320686340332/0