Преобразование байтового массива в строку шестнадцатеричных символов и обратно является обыденной задачей в программировании, особенно при работе с низкоуровневыми операциями. В Delphi есть встроенные функции для выполнения подобных операций, но также возможно написать свои собственные реализации. Ниже представлен пример такой реализации на Object Pascal.
Преобразование байтового массива в строку шестнадцатеричных символов
Для начала рассмотрим функцию, которая преобразует массив байтов в строку шестнадцатеричных символов. В коде используется константа HexSymbols, содержащая символы от 0 до F для представления шестнадцатеричных чисел.
function bintoHex(const bin: array of byte): String;
const
HexSymbols = '0123456789ABCDEF';
var
i: integer;
begin
SetLength(Result, 2 * Length(bin));
for i := 0 to Length(bin) - 1 do begin
Result[1 + 2 * i + 0] := HexSymbols[1 + bin[i] shr 4];
Result[1 + 2 * i + 1] := HexSymbols[1 + bin[i] and $0F];
end;
end;
Обратное преобразование
Теперь рассмотрим функцию, которая выполняет обратное преобразование, то есть преобразует строку шестнадцатеричных символов обратно в байтовый массив. Важно помнить, что каждый байт в массиве представляет собой пару символов в строке шестнадцатеричных чисел.
function xHexToBin(const HexStr: String): TBytes;
var
i, J: Integer;
B: Byte;
begin
SetLength(Result, (Length(HexStr) + 1) shr 1);
B:= 0;
i := 0;
while I < Length(HexStr) do begin
J:= 0;
while J < Length(HexSymbols) do begin
if HexStr[I + 1] = HexSymbols[J + 1] then Break;
Inc(J);
end;
if J = Length(HexSymbols) then // ошибка, если символ не является шестнадцатеричным
raise Exception.Create('Недопустимый символ в строке шестнадцатеричных чисел');
if Odd(I) then
Result[I shr 1]:= B shl 4 + J
else
B:= J;
Inc(I);
end;
if Odd(I) then Result[I shr 1]:= B;
end;
Использование встроенных функций RTL
Для упрощения задачи можно использовать встроенные функции BinToHex и HexToBin, предоставляемые RTL. Пример использования этих функций:
{$APPTYPE CONSOLE}
uses
System.Classes,
System.SysUtils;
var
LArray : array[1..6] of Byte = (10, 11, 12, 13, 14, 15);
LText: string;
I : integer;
begin
try
SetLength(LText, Length(LArray)*2);
BinToHex(@LArray[1], PChar(LText), SizeOf(LArray));
// Вывод строки в шестнадцатеричном формате
Writeln(LText);
// Заполнение массива нулями
FillChar(LArray, SizeOf(LArray), #0);
// Чтение значений из строки в шестнадцатеричном формате обратно в массив
HexToBin(PChar(LText), @LArray, Length(LArray) div 2);
// Вывод значений массива
for I := Low(LArray) to High(LArray) do
Write(LArray[I]);
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Используя эти функции, можно значительно упростить процесс преобразования данных между байтовыми массивами и строками шестнадцатеричных чисел.
Преобразование байтового массива в строку шестнадцатеричных символов и обратно является важной задачей в программировании, особенно при работе с низкоуровневыми операциями, и в языке Delphi существуют встроенные функции для выполнения таких операций, а т
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS