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

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

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

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

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

function HexToInt(s: string): Longword;
 var
   b: Byte;
   c: Char;
 begin
   Result := 0;
   s := UpperCase(s);
   for b := 1 to Length(s) do
   begin
     Result := Result * 16;
     c := s[b];
     case c of
       '0'..'9': Inc(Result, Ord(c) - Ord('0'));
       'A'..'F': Inc(Result, Ord(c) - Ord('A') + 10);
       else
         raise EConvertError.Create('No Hex-Number');
     end;
   end;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   ShowMessage(IntToStr(StrToHex('AAF1'))); // > 43761 
end;


 {*************************************************}


 procedure HexToInt(s: string): Integer;
 begin
   Result := StrToInt('$' + s);
 end;

 {*************************************************}

 function HexToInt(strHexValue : string) : Integer;
 var
  c,l : integer;
 begin
   Val(strHexValue, l, c);
   Result := l;
 end;

 procedure TForm1.Button2Click(Sender: TObject);
 begin
  ShowMessage(IntToStr(HexToInt('$EAD1')));
 end;


 {***************************************************}

 unit HexConvert;
 { by Andre Fritzsche }

 interface

 uses SysUtils;

 // Wandelt Hexadezimalwert in Value zu Zahl 
function HexTo(Value: string): Longword;

 // Wandelt Bytewert aus Value in Hexadezimalwert (String) 
function ToHex(Value: Byte): string; overload;

 // Wandelt Wordwert aus Value in Hexadezimalwert (String) und 
// trennt Hi- und Lo-Byte durch Splitter 
function ToHex(Value: Word; Splitter: Char): string; overload;

 // Wandelt Longwordwert aus Value in Hexadezimalwert (String) und 
// trennt Hi- und Lo-Word durch Splitter 
function ToHex(Value: Cardinal; Splitter: Char): string; overload;

 implementation

 const
    HexTbl: string = '0123456789ABCDEF';
   {------------------------------------------------------------------------------}

 function HexTo(Value: string): Longword;
 var
    intX, PosCnt: Byte;
   zwVal: Integer;
 begin
   Result := 0;
   PosCnt := 0; //Halb-Byte-Position 
  for intX := Length(Value) - 1 downto 0 do
    begin     //alle Zeichen von links durchlaufen 
    zwVal := Pos(UpperCase(Value[intX + 1]), HexTbl) - 1; //prufen, ob Zeichen aus Value 
    if zwVal >= 0 then
      begin  //in HexTbl vorkommt und Position zu zwVal 
      Result := Result + (zwVal shl (4 * PosCnt));
       //zwVal 4*Halbbyteposition Bits nach links verschieben 
      Inc(PosCnt);  //Halb-Byte Position erhohen 
    end;
   end;
 end;
 {------------------------------------------------------------------------------}

 function ToHex(Value: Byte): string;
 var
    zwVal: Byte;
 begin
   zwVal  := (Value and $0F);          //erstes (Lo)-Byte von Value maskieren 
  Result := HexTbl[zwVal + 1];        //aus HexTbl zu Result 
  zwVal  := (Value and $F0) shr 4;
   //zweites (Hi)-Byte von Value maskieren und 4Bits nach rechts verschieben 
  Result := HexTbl[zwVal + 1] + Result; //aus HexTbl vor Result 
end;
 {------------------------------------------------------------------------------}

 function ToHex(Value: Word; Splitter: Char): string;
 begin
   Result := ToHex(Byte(Lo(Value)));   //LoByte umwandeln, zu Result 
  Result := ToHex(Byte(Hi(Value))) + Splitter + Result;
   //HiByte umwandeln, zu Result, Trennzeichen davorsetzen 
end;
 {------------------------------------------------------------------------------}

 function ToHex(Value: Cardinal; Splitter: Char): string;
 var
    zwVal: Word;
 begin
   zwVal  := Value and $0000FFFF; //loword maskieren 
  Result := ToHex(Word(zwVal)); //umwandeln und zu Result 
  zwVal  := (Value and $FFFF0000) shr 16; //hiword maskieren 
  Result := ToHex(Word(zwVal)) + Splitter + Result;
   //umwandeln und zu Result, Trennzeichen davorsetzen 
end;
 {------------------------------------------------------------------------------}

 end.

Перевод на русский язык:

Это сборник фрагментов кода на Delphi, демонстрирующих различные способы конвертации строк в шестнадцатеричном формате в целые числа и обратно.

Функция HexToInt (первая версия)

function HexToInt(s: string): Longword;
var
  b, c: Byte;
begin
  Result := 0;
  s := UpperCase(s);
  for b := 1 to Length(s) do
  begin
    Result := Result * 16;
    c := s[b];
    case c of
      '0'..'9': Inc(Result, Ord(c) - Ord('0'));
      'A'..'F': Inc(Result, Ord(c) - Ord('A') + 10);
    else
      raise EConvertError.Create('No Hex-Number');
    end;
  end;
end;

Эта функция конвертирует строку в шестнадцатеричном формате в целое число. Она проходит по строке, умножая результат на 16 для каждого символа, и затем добавляет значение символа (преобразованное в его код ASCII минус код ASCII '0' или 'A').

Функция HexToInt (вторая версия)

function HexToInt(s: string): Integer;
begin
  Result := StrToInt('$' + s);
end;

Эта функция проще и использует встроенную функцию StrToInt для конвертации строки в шестнадцатеричном формате в целое число.

Функция HexToInt (третья версия)

function HexToInt(strHexValue: string): Integer;
var
  c, l: Integer;
begin
  Val(strHexValue, l, c);
  Result := l;
end;

Эта функция использует функцию Val для конвертации строки в шестнадцатеричном формате в целое число.

Единица HexConvert

unit HexConvert;

interface

uses SysUtils;

function HexTo(Value: string): Longword;
// Конвертирует строку в шестнадцатеричном формате в longword-значение
function ToHex(Value: Byte): string; overload;
// Конвертирует byte-значение в строку в шестнадцатеричном формате
function ToHex(Value: Word; Splitter: Char): string; overload;
// Конвертирует word-значение в строку в шестнадцатеричном формате, с разделителем между высоким и низким байтами
function ToHex(Value: Cardinal; Splitter: Char): string; overload;
// Конвертирует cardinal-значение в строку в шестнадцатеричном формате, с разделителем между высоким и низким словами

implementation

const
  HexTbl: string = '0123456789ABCDEF';

function HexTo(Value: string): Longword;
var
  intX, PosCnt: Byte;
  zwVal: Integer;
begin
  Result := 0;
  PosCnt := 0; // Позиция полубайта
  for intX := Length(Value) - 1 downto 0 do
    begin
      zwVal := Pos(UpperCase(Value[intX + 1]), HexTbl) - 1; // Проверяет, является ли символ в HexTbl и получает его позицию
      if zwVal >= 0 then
        begin
          Result := Result + (zwVal shl (4 * PosCnt));
          Inc(PosCnt); // Увеличивает позицию полубайта
        end;
    end;
end;

function ToHex(Value: Byte): string;
var
  zwVal: Byte;
begin
  zwVal := Value and $0F; // Маскирует низкий байт значения
  Result := HexTbl[zwVal + 1]; // Преобразует низкий байт в символ шестнадцатеричного формата
  zwVal := (Value and $F0) shr 4; // Маскирует высокий байт значения и сдвигает его правее на 4 бита
  Result := HexTbl[zwVal + 1] + Result; // Преобразует высокий байт в символ шестнадцатеричного формата и добавляет его к результату
end;

function ToHex(Value: Word; Splitter: Char): string;
begin
  Result := ToHex(Byte(Lo(Value))); // Конвертирует низкий байт значения в строку шестнадцатеричного формата
  Result := ToHex(Byte(Hi(Value))) + Splitter + Result; // Конвертирует высокий байт значения в строку шестнадцатеричного формата и добавляет ее к результату
end;

function ToHex(Value: Cardinal; Splitter: Char): string;
var
  zwVal: Word;
begin
  zwVal := Value and $0000FFFF; // Маскирует низкое слово значения
  Result := ToHex(Word(zwVal)); // Конвертирует низкое слово в строку шестнадцатеричного формата
  zwVal := (Value and $FFFF0000) shr 16; // Маскирует высокое слово значения и сдвигает его правее на 16 бит
  Result := ToHex(Word(zwVal)) + Splitter + Result; // Конвертирует высокое слово в строку шестнадцатеричного формата и добавляет ее к результату
end;

end.

Эта единица содержит несколько функций, конвертирующих между строками в шестнадцатеричном формате и целыми числами. Функция HexTo конвертирует строку в шестнадцатеричном формате в целое число, а функции ToHex конвертируют целые числа в строки шестнадцатеричного формата. Функции ToHex с двумя параметрами также могут разделить получающуюся строку шестнадцатеричного формата на несколько частей с помощью указанного разделителя.

В целом, эти кодовые фрагменты демонстрируют различные способы конвертации между строками в шестнадцатеричном формате и целыми числами в Delphi.

Преобразование шестнадцатеричных чисел в целые: описаны несколько способов преобразования шестнадцатеричного представления чисел в целочисленное.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-10-07 04:19:02/0.0063860416412354/1