Вспомогательные функции, из проектов
Пусть на входе есть строка
1 |
#50#54#51#171#56#53#173#65#55#52#172#64#57#58#59#60#61#62#63#175#176#177#178#179#180#165#166#167#168#169#170#181 |
Строка – > массив байт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
type ArrayOfByte = array of byte; function Str2Hex(s: string): ArrayOfByte; var i: Integer; sLength: Integer; begin sLength := Length(s); if (sLength > 0) then begin SetLength(Result, sLength); for i := 0 to High(Result) do Result[i] := Ord(S[i + 1]); end; end; |
Получили массив байт
1 |
(50, 54, 51, 171, 56, 53, 173, 65, 55, 52, 172, 64, 57, 58, 59, 60, 61, 62, 63, 175, 176, 177, 178, 179, 180, 165, 166, 167, 168, 169, 170, 181) |
Байт -> StrHex (Шестнадцатеричное представление)
1 2 3 4 5 6 |
function ByteToHex(InByte: byte): shortstring; const Digits: array[0..15] of char = '0123456789ABCDEF'; begin result := digits[InByte shr 4] + digits[InByte and $0F]; end; |
1 2 3 4 5 6 7 8 |
function Hex2StrHex(aBuf: ArrayOfByte): string; var i: Integer; begin Result := ''; for i := Low(aBuf) to High(aBuf) do Result := Result + ByteToHex(aBuf[i]); // Format('%x', [aBuf[i]]) работает не совсем корректно в данном случае, 7 переводит в 7, а не 07 end; |
Шестнадцатеричное представление
1 |
'323633AB3835AD413734AC40393A3B3C3D3E3FAFB0B1B2B3B4A5A6A7A8A9AAB5' |
Или, расставив пробелы, получим
1 |
32 36 33 AB 38 35 AD 41 37 34 AC 40 39 3A 3B 3C 3D 3E 3F AF B0 B1 B2 B3 B4 A5 A6 A7 A8 A9 AA B5 |
Шестнадцатеричное представление -> байты
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function StrHex2Hex(sHex: string): ArrayOfByte; var i: Integer; sHexLength: Integer; sHexWithoutSpaces: string; begin sHexWithoutSpaces := ''; for i := 1 to Length(SHex) do if SHex[i] <> ' ' then sHexWithoutSpaces := sHexWithoutSpaces + SHex[i]; sHexLength := Length(sHexWithoutSpaces); if (sHexLength > 0) and (sHexLength mod 2 = 0) then begin SetLength(Result, sHexLength div 2); for i := 0 to High(Result) do Result[i] := StrToInt('$' + Copy(sHexWithoutSpaces, i * 2 + 1, 2)); end; end; |
Получили массив байт
1 |
(50, 54, 51, 171, 56, 53, 173, 65, 55, 52, 172, 64, 57, 58, 59, 60, 61, 62, 63, 175, 176, 177, 178, 179, 180, 165, 166, 167, 168, 169, 170, 181) |
Либо есть ещё один вариант, через стандартные функции Delphi
1 2 3 4 5 6 7 8 9 10 11 |
function ConvertHexStringToBinary(const strInHex: ansistring; out errorMsg: string): ansistring; var noSpaces: ansistring; begin noSpaces:= LowerCase(AnsiReplaceText(strInHex, ' ', '')); SetLength(Result, Length(NoSpaces) div 2); if (Length(Result) = HexToBin(PChar(noSpaces), PChar(Result), Length(Result))) then errorMsg:= '' else errorMsg:= 'Hex To bin returns a number of converted symbols'; end; |
Массив байт -> строка
1 2 3 4 5 6 7 8 9 10 11 12 |
function Hex2Str(aBuf: array of byte): string; var i: integer; bufLength: integer; begin bufLength := Length(aBuf); Result := ''; for i := 0 to BufLength - 1 do begin Result := Result + Chr(aBuf[i]); end; end; |
Вернулась строка
1 |
'263«85A74¬@9:;<=>?¯°±²³´¥¦§¨©ªµ' |
Переведем ее в числовое представление строки
1 2 3 4 5 6 7 8 |
function StrToOrdStr(aChrStr: string): string; var i: integer; begin Result := ''; for i := 1 to Length(aChrStr) do Result := Result + '#' + IntToStr(Ord(aChrStr[i])); end; |
Результат
1 |
'#50#54#51#171#56#53#173#65#55#52#172#64#57#58#59#60#61#62#63#175#176#177#178#179#180#165#166#167#168#169#170#181' |