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 := 1to
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) <> 0then
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
:= 1to
Lendo
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
:= 1to
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
;
'Delphi' 카테고리의 다른 글
[Delphi] File Binary 관련 함수 (1) | 2011.06.12 |
---|---|
[Delphi] 델파이 초보들에게 매우 도움되는 사이트 소개 (0) | 2011.03.01 |
[Delphi] Instr, Mid 함수는 어디에...? (0) | 2011.03.01 |
[Delphi] String -> Hex 로 변환 (0) | 2011.03.01 |