delphi4arab منتديات دلفي للعرب

نسخة كاملة : استفسار بخصوص تحويل قيم الهيكس
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
استفسار بخصوص تحويل قيم الهيكس الى ارقام صحيحه بمعنى لو لدى مثلا ففى اديت قيمه d82a بالهيكس يكون الناتج لها داخل اديت 2
10968
وعمليه وعكسها لو امكن
السلام عليكم

كود :
Edit2.Text:=[color=Red]IntToHex[/color](StrToInt(Edit1.Text),1)
بعد اذن الاخ الفاضل بي سات صاحب الفضل في طرح هذه الاسئلة المهمة اسمحلي اخي ان اسئل
اخي الفاضل paix144 هل ممكن طريقة تجعل كتابة البيانات بالهكس تفصل بينها مسافة بشكل الي ...وللتوصيح مثلا حين نكتب ffffff تصبح داخل البرنامج بهذا التنسيق ff ff ff .....المطلوب طريقة اضافة الفراغ بين القيم دون ان يسبب مشاكل برمجية وحسابية
paix144 كتب :السلام عليكم

كود :
Edit2.Text:=[COLOR=Red]IntToHex[/COLOR](StrToInt(Edit1.Text),1)

شكرا اخى الغالى
didrosoft كتب :بعد اذن الاخ الفاضل بي سات صاحب الفضل في طرح هذه الاسئلة المهمة اسمحلي اخي ان اسئل
اخي الفاضل paix144 هل ممكن طريقة تجعل كتابة البيانات بالهكس تفصل بينها مسافة بشكل الي ...وللتوصيح مثلا حين نكتب ffffff تصبح داخل البرنامج بهذا التنسيق ff ff ff .....المطلوب طريقة اضافة الفراغ بين القيم دون ان يسبب مشاكل برمجية وحسابية
العمل اليدوى بالهيكس جيد ولاكن من الواضح تحويله برمجيا صعب

سنحاول ليوفقنا الله
paix144 كتب :السلام عليكم

كود :
edit2.text:=[color=red]inttohex[/color](strtoint(edit1.text),1)

اخي هذا الكود لا يعمل بعد التجريب
إقتباس :اخي هذا الكود لا يعمل بعد التجريب

يجب اضافة علامة الدولار Smile
PHP كود :
Edit2.Text := IntToStr(StrToInt('$' + Edit1.Text)); 

بالنسبة للسؤال الثاني :
إقتباس :هل ممكن طريقة تجعل كتابة البيانات بالهكس تفصل بينها مسافة بشكل الي ...وللتوصيح مثلا حين نكتب ffffff تصبح داخل البرنامج بهذا التنسيق ff ff ff

هذا حل على السريع :
PHP كود :
{ ===> By SMP3 <=== }
const
  
TwoHexLookup: packed array [0 .. 255] of array [1 .. 3] of Char = ( //
    
'00 ', '01 ', '02 ', '03 ', '04 ', '05 ', '06 ', '07 ', '08 ', '09 ', '0A ', '0B ', '0C ', '0D ', '0E ', '0F ', '10 ', '11 ', '12 ', '13 ', '14 ', '15 ',
    
'16 ', '17 ', '18 ', '19 ', '1A ', '1B ', '1C ', '1D ', '1E ', '1F ', '20 ', '21 ', '22 ', '23 ', '24 ', '25 ', '26 ', '27 ', '28 ', '29 ', '2A ', '2B ',
    
'2C ', '2D ', '2E ', '2F ', '30 ', '31 ', '32 ', '33 ', '34 ', '35 ', '36 ', '37 ', '38 ', '39 ', '3A ', '3B ', '3C ', '3D ', '3E ', '3F ', '40 ', '41 ',
    
'42 ', '43 ', '44 ', '45 ', '46 ', '47 ', '48 ', '49 ', '4A ', '4B ', '4C ', '4D ', '4E ', '4F ', '50 ', '51 ', '52 ', '53 ', '54 ', '55 ', '56 ', '57 ',
    
'58 ', '59 ', '5A ', '5B ', '5C ', '5D ', '5E ', '5F ', '60 ', '61 ', '62 ', '63 ', '64 ', '65 ', '66 ', '67 ', '68 ', '69 ', '6A ', '6B ', '6C ', '6D ',
    
'6E ', '6F ', '70 ', '71 ', '72 ', '73 ', '74 ', '75 ', '76 ', '77 ', '78 ', '79 ', '7A ', '7B ', '7C ', '7D ', '7E ', '7F ', '80 ', '81 ', '82 ', '83 ',
    
'84 ', '85 ', '86 ', '87 ', '88 ', '89 ', '8A ', '8B ', '8C ', '8D ', '8E ', '8F ', '90 ', '91 ', '92 ', '93 ', '94 ', '95 ', '96 ', '97 ', '98 ', '99 ',
    
'9A ', '9B ', '9C ', '9D ', '9E ', '9F ', 'A0 ', 'A1 ', 'A2 ', 'A3 ', 'A4 ', 'A5 ', 'A6 ', 'A7 ', 'A8 ', 'A9 ', 'AA ', 'AB ', 'AC ', 'AD ', 'AE ', 'AF ',
    
'B0 ', 'B1 ', 'B2 ', 'B3 ', 'B4 ', 'B5 ', 'B6 ', 'B7 ', 'B8 ', 'B9 ', 'BA ', 'BB ', 'BC ', 'BD ', 'BE ', 'BF ', 'C0 ', 'C1 ', 'C2 ', 'C3 ', 'C4 ', 'C5 ',
    
'C6 ', 'C7 ', 'C8 ', 'C9 ', 'CA ', 'CB ', 'CC ', 'CD ', 'CE ', 'CF ', 'D0 ', 'D1 ', 'D2 ', 'D3 ', 'D4 ', 'D5 ', 'D6 ', 'D7 ', 'D8 ', 'D9 ', 'DA ', 'DB ',
    
'DC ', 'DD ', 'DE ', 'DF ', 'E0 ', 'E1 ', 'E2 ', 'E3 ', 'E4 ', 'E5 ', 'E6 ', 'E7 ', 'E8 ', 'E9 ', 'EA ', 'EB ', 'EC ', 'ED ', 'EE ', 'EF ', 'F0 ', 'F1 ',
    
'F2 ', 'F3 ', 'F4 ', 'F5 ', 'F6 ', 'F7 ', 'F8 ', 'F9 ', 'FA ', 'FB ', 'FC ', 'FD ', 'FE ', 'FF ');

  
HexMask: array [0 .. 3] of DWORD = ($FF, $FF00, $FF0000, $FF000000);
  
HexMaskMove: array [0 .. 3] of DWORD = ($0, $8, $10, $18);

function 
IntToMyFormat(Value: UINT): string;
var
  
LValue: UInt64;
  
nDigit, i: integer;
begin
  Result 
:= '';
  
LValue := Value;
  if 
LValue and ($FF shl $18) <> 0 then
    nDigit 
:= 8
  
else if LValue and ($FF shl $10) <> 0 then
    nDigit 
:= 6
  
else if LValue and $FF00 <> 0 then
    nDigit 
:= 4
  
else
    
nDigit := 2;
  for 
i := (nDigit shr 1) downto 1 do
  
begin
    LValue 
:= Byte((Value and HexMask[i - 1]) shr HexMaskMove[i - 1]);
    
Result := Result + TwoHexLookup[LValue];
  
end;
  
Result := Trim(Result);
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  
sHex: string;
begin
  sHex 
:= IntToMyFormat($FFFFFF);
  
Edit2.Text := sHex; // sHex = FF FF FF  .
end; 
طريقة آخرى بإستعمال Format and IntToHex
طريقة التحويل من هكس إلى عدد صحيح :
PHP كود :
function ConvertToInt(Hex : Cardinal):Integer ;
begin
  Result 
:= StrToInt(Format('%d', [Hex]));
end; 
وهذه دالة التحويل من عدد صحيح إلى هكس والمخرجات (string)
PHP كود :
function ConvertToHexAsString(i : Byte):string;
begin
  Result 
:= IntToHex(i, 2);
end;

function 
ConvertToHexAsString(i : Word):string;
begin
  Result 
:= IntToHex(i, 4);
end;

function 
ConvertToHexAsString(i : DWORD):string;
begin
  Result 
:= IntToHex(i, 8);
end;

function 
ConvertToHexAsString(i : UInt64):string;
begin
  Result 
:= IntToHex(i, 16);
end; 

وهذا تطبيق لـ
إقتباس :هل ممكن طريقة تجعل كتابة البيانات بالهكس تفصل بينها مسافة بشكل الي ...وللتوصيح مثلا حين نكتب ffffff تصبح داخل البرنامج بهذا التنسيق ff ff ff
PHP كود :
unit Unit1;

interface

uses
  Winapi
.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 
= class(TForm)
    
btn1: TButton;
    
mmo1: TMemo;
    
procedure btn1Click(Sender: TObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1: TForm1;

const
  
arrX : array[0..19] of Byte = ($55, $2, $FF, $C3, $A1, $EE, $71, $4E, $CD, $10,
    $
32, $85, $A9, $E3, $DF, $A, $CE, $00, $00, $C3);

function 
ConvertToHexAsString(i : UInt64):string; overload;
function 
ConvertToHexAsString(i : DWORD):string; overload;
function 
ConvertToHexAsString(i : Word):string; overload;
function 
ConvertToHexAsString(i : Byte):string; overload;

implementation

{$R *.dfm}

function 
ConvertToInt(Hex : Cardinal):Integer ;
begin
  Result 
:= StrToInt(Format('%d', [Hex]));
end;

function 
ConvertToHexAsString(i : Byte):string;
begin
  Result 
:= IntToHex(i, 2);
end;

function 
ConvertToHexAsString(i : Word):string;
begin
  Result 
:= IntToHex(i, 4);
end;

function 
ConvertToHexAsString(i : DWORD):string;
begin
  Result 
:= IntToHex(i, 8);
end;

function 
ConvertToHexAsString(i : UInt64):string;
begin
  Result 
:= IntToHex(i, 16);
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  
sLine : string;
  
i : Integer;
begin
  
//test ConvertToInt
  
mmo1.Lines.Add(IntToStr(ConvertToInt($FF)));

  
//test ConvertToHexAsString
  
mmo1.Lines.Add(ConvertToHexAsString(11111111111111111111));

  
//test add byte by byte with space between them into memo
  
ZeroMemory(@sLine, SizeOf(sLine));
  for 
i := 0 to Length(arrX)-1 do
    
sLine := sLine + ' ' + ConvertToHexAsString(ArrX[i]);
  
mmo1.Lines.Add(sLine);
end;

end. 
طبقت على XE7
والسلام عليكم