2013-09-12

[델파이] Hex, Bin, Str 변환

출처 : http://ysm1180.tistory.com/68

interface

uses
  SysUtils, Classes;

type
  byDynamicArr = array of byte;

function HexToByteArr(Hexs: string): byDynamicArr;
function HexToStr(Hexs: byDynamicArr): string;
function AnsiStrToHex(const str: string; Len: integer): string; overload;
function AnsiStrToHex(const str: string): string; overload;
function ByteArrToHex(Hexs: byDynamicArr): string;

implementation

function CharToByte(AChar: Char): byte; //Ascii Code
begin
  if charinset(AChar, ['0' .. '9']) then
    Result := byte(Ord(AChar) - Ord('0'))
  else
    Result := byte(10 + Ord(AChar) - Ord('A'));
end;

function ByteArrToHex(Hexs: byDynamicArr): string;
var
  i: integer;

begin
  Result := '';
  for i := low(Hexs) to high(Hexs) do
    Result := Result + inttohex(Hexs[i], 2);

end;

function HexToByteArr(Hexs: string): byDynamicArr; //String Hex -> Byte Array
var
  i: integer;
  byDynamicArray: byDynamicArr;
begin
  Hexs := stringreplace(Hexs, ' ', '', [rfReplaceAll]); // Space ' ' -> Null
  Hexs := UpperCase(Hexs);

  setlength(byDynamicArray, trunc(length(Hexs) / 2));
  fillchar(byDynamicArray[0], sizeof(byDynamicArray), 0);

  for i := 1 to trunc(length(Hexs) / 2) do // Hex -> Byte Arr
  begin
    byDynamicArray[i - 1] := (CharToByte(Hexs[i * 2 - 1]) * 16) + CharToByte(Hexs[i * 2]);
  end;
  Result := byDynamicArray;
end;

function HexToStr(Hexs: byDynamicArr): string; //Byte Array -> Ansi String
var
  i: integer;
  charValue: byte;
  temp: ansistring;

begin
  temp := '';
  for i := Low(Hexs) to High(Hexs) do
  begin
    charValue := Hexs[i];
    temp := temp + ansiChar(charValue);
  end;
  Result := string(temp);

  if pos(#0, Result) <> 0 then
    Result := copy(Result, 1, pos(#0, Result) - 1);
end;


function AnsiStrToHex(const str: string; Len: integer): string; overload; //Fix Length Hex
var
  Index: integer;
  temp: ansistring;

begin
  Result := '';
  temp := ansistring(str);

  for Index := 1 to Len do
    if length(temp) < Index then //rest is '00'
      Result := Result + '00'
    else
      Result := Result + inttohex(Ord(temp[Index]), 2);
end;

function AnsiStrToHex(const str: string): string; overload;
var
  Index: integer;
  temp: ansistring;

begin
  Result := '';
  temp := ansistring(str);

  for Index := 1 to length(temp) do
    Result := Result + inttohex(Ord(temp[Index]), 2);
end;

end.