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

Перегонка бинарного потока в строку с HEX-текстом и обратно

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



Автор: Delirium
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
В модуле Classes существует базовая процедура BinToHex для преобразования
бинарного буфера в набор HEX-кодов (PChar to PChar), однако применительно
к потокам, работа с этой процедура требует дополнительных действий.
Я заточил эту задачу под потоки, попросту немного переработав классический код.

Зависимости: Classes
Автор:       Delirium, Master_BRAIN@beep.ru, ICQ:118395746, Москва
Copyright:   Master BARIN (Delirium)
Дата:        31 января 2003 г.
***************************************************** }

// Перегонка бинарного потока в строку с HEX-текстом

function StreamToHex(Buf: TStream): string;
const
  Convert: array[0..15] of Char = '0123456789ABCDEF';
var
  i, p: integer;
  B: byte;
begin
  SetLength(Result, Buf.Size * 2);
  p := Buf.Position;
  Buf.Position := 0;
  for i := 1 to Buf.Size do
  begin
    Buf.Read(B, 1);
    Result[(i * 2) - 1] := Convert[B shr $4];
    Result[(i * 2)] := Convert[B and $F];
  end;
  Buf.Position := p;
end;

// Перегонка строки с HEX-текстом в бинарный поток

procedure HexToStream(Hex: string; Buf: TStream);
const
  Convert: array['0'..'f'] of SmallInt =
  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
    -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, 10, 11, 12, 13, 14, 15);
var
  i, p: integer;
  B: Byte;
begin
  if Buf.Size < Length(Hex) div 2 then
    Buf.Size := Length(Hex) div 2;
  p := Buf.Position;
  Buf.Position := 0;
  i := 1;
  while i <= Length(Hex) do
  begin
    if not (Hex[i] in ['0'..'f'])
      or not (Hex[i + 1] in ['0'..'f']) then
      Break;
    B := Byte((Convert[Hex[i]] shl 4) + Convert[Hex[i + 1]]);
    Buf.Write(B, 1);
    Inc(i, 2);
  end;
  Buf.Position := p;
end;

// Пример использования:
var
  St: TStream;
begin
  St := TMemoryStream.Create;
  Memo1.Lines.SaveToStream(St);
  Memo1.Text := StreamToHex(St);
  St.Destroy;
end;

Программа на Delphi, которая предлагает два функционала: StreamToHex и HexToStream. Эти функционалы позволяют конвертировать двоичные потоки данных в строковые представления в шестнадцатеричной системе счисления и обратно.

StreamToHex

Функция StreamToHex принимает объект TStream как входной параметр и возвращает строку, содержащую шестнадцатеричное представление содержимого потока. Работает следующим образом:

  1. Устанавливает длину результата в два раза больше размера входного потока.
  2. Resets the position of the input stream to 0.
  3. Итерирует по потоку, читая один байт за раз и конвертируя каждый байт в его шестнадцатеричное представление с помощью массива Convert, содержащего символы '0'..'9' и 'A'..'F'.
  4. Добавляет шестнадцатеричное представление каждого байта к результатной строке.

HexToStream

Функция HexToStream принимает строку в шестнадцатеричной системе счисления как входной параметр и записывает ее в объект TStream. Работает следующим образом:

  1. Проверяет, является ли размер выходного потока достаточным для входной строки в шестнадцатеричной системе счисления, и корректирует его если необходимо.
  2. Resets the position of the output stream to 0.
  3. Итерирует по строке, два символа за раз (представляющие один байт).
  4. Для каждого пары символов конвертирует их в соответствующий байт с помощью массива Convert, содержащего индексы для '0'..'9' и 'A'..'F'.
  5. Записывает конвертированный байт в выходной поток.

Пример использования

Примерный код демонстрирует, как использовать эти функционалы вместе. Он создает объект TMemoryStream, сохраняет содержимое memo-контрола (Memo1) в него, конвертирует поток в строку шестнадцатеричной системы счисления с помощью StreamToHex и затем уничтожает памятный поток.

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

В статье описана процедура для преобразования бинарного потока в строку с HEX-текстом и обратно, а также пример ее использования.


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

Получайте свежие новости и обновления по 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:41:38/0.022598028182983/1