본문 바로가기

Delphi

[Delphi] Ansi String <-> Hex <-> Byte Array 함수


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.

게임 에디터를 만들다 보니 Binary Hex 부분을 많이 건들게되고 그 Hex들을 string 으로 변환시켜야 되는 작업도

필요하다보니 직접 만들게 됐네요.


Delphi 2010 기본 Char Set이 유니코드다 보니까 기존에 했던 방식으로 해도 안되는게 너무 많았서 검색 좀 해봐도

이 쪽에 관해서 정보가 좀 부족하더라고요.

그래도 여차저차 한참 구글링하다보니 결국 구현하긴 했는데...  저 같은 분들이 또 생기지 않았으면 해서 

이렇게 글을 올립니다.


아무래도 제가 Delphi 2010 을 쓰니까 그 이하의 버전에서는 작동할지는 잘 모르겠네요. 

.pas 파일도 올립니다.


 

예제)
procedure Example();
var
  byArr : byDynamicArr;
  str, hex : string;

begin
  str := 'Hello';
  hex := AnsiStrToHex(str); //Hex = '48656C6C6F'
  byArr := HexToByteArr(Hex); //byArr = (0x48, 0x65, 0x6C, 0x6C, 0x6F);

  byArr[0] := byte(ord('A'));
  str := HexToStr(byArr); //str = 'Aello'
end;