![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Hex в String и наоборот [D7, WinXP]
Al1 © (2004-11-21 18:35:00)Мастера подскажите пожалуйста как из Hex переводить в String и наоборот. Есть у меня например некая последовательность байт: Buf: array of Byte
мне надо етот Buf перевести в строку, содержашую его HEX формат
s : string , где длина строки получиться равной длине Buf * 2 и обратно!
Может есть некие компоненты, с помошью которых можно было бы легко оперировать с HEX?
Al1 (2004-11-22 18:01:00) [1]
> begin...end © (22.11.04 17:50) [51]
Понятно! Буду иметь ввиду! Спасибо.
begin...end (2004-11-22 17:50:00) [2]
> [50] Al1 (22.11.04 17:28)
Зато можно что-то перепутать и передать, например, число, бОльшее, чем вообще возможно. А это уже будет выход за границы.
> [48] Al1 (22.11.04 17:13)
> function Hex2StrHex (Buf : array of byte; BufLength : integer):String;
> for I := 1 to BufLength do
Ошибка. Buf: array of Byte- это ОТКРЫТЫЙ массив. Для них, как и для динамических, нумерация элементов начинается с нуля. Здесь, ИМХО, лучше заменить array of byteна уже объявленный тобой тип - динамический массив - ArrayOfByte. Но нижний индекс всё равно будет равен нулю, так что советую здесь вместо 1 и BufLength использовать Low(Buf) и High(Buf).
Al1 (2004-11-22 17:28:00) [3]
> begin...end © (22.11.04 17:22) [49]
>
> > [48] Al1 (22.11.04 17:13)
>
> А зачем в функции передавать длины массивов и строк, когда
> их (длины) можно определять внутри функций?
на случай универсальности.... вдруг забудешь укоротить строчку, после работы с ней!... или в буфере допустим тебе надо будет скушать и обработать кусок а не весь!... :-)
begin...end (2004-11-22 17:22:00) [4]
> [48] Al1 (22.11.04 17:13)
А зачем в функции передавать длины массивов и строк, когда их (длины) можно определять внутри функций?
Al1 (2004-11-22 17:13:00) [5]Уважаемые мастера, вроде получился у меня какойто результат:
type ArrayOfByte = array of byte;
implementation
{$R *.dfm}
function Hex2StrHex (Buf : array of byte; BufLength : integer):String;
var i : integer;
begin
Result := '';
for I := 1 to BufLength do
begin
Result := Result + Format('%x', [Buf[I]])
end;
end;
function Hex2Str (Buf : array of byte; BufLength : integer):String;
var i : integer;
begin
Result := '';
for I := 1 to BufLength do
begin
Result := Result + Chr(Buf[I]);
end;
end;
function StrHex2Hex (SHex : string; SHexLength : integer):ArrayOfByte;
var
I: Integer;
begin
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(SHex, I * 2 + 1, 2));
end;
end;
function Str2Hex (S : string; SLength : integer):ArrayOfByte;
var
I: Integer;
begin
if (SLength > 0) then
begin
SetLength(Result, SLength);
for I := 0 to High(Result) do
Result[I] := Ord(S[i+1]);
end;
end;
Проверьте пожалуйста, может чтото не так?
И еще вопросик: а как обьявить function (): array of byte, не обьявляя новый тип: type ArrayOfByte = array of byte ???
Заранее спасибо.
begin...end (2004-11-22 16:23:00) [6]
> [46] Al1 (22.11.04 16:21)
> Хорошо а как узнать по символу его код?
Ord()
Al1 (2004-11-22 16:21:00) [7]Хорошо а как узнать по символу его код?
(обратный процесс ф-ции Chr)
Anatoly Podgoretsky (2004-11-22 16:01:00) [8]Уже перевел, но только строку в массив байтов, если конечно компилятор не обругает.
Al1 (2004-11-22 15:54:00) [9]
> Anatoly Podgoretsky © (22.11.04 15:40) [43]
> Еще раз ХЕКС уже строка
и?
var buf : array of byte;
s : string;
Buf := s; ???
как перевести?
Anatoly Podgoretsky (2004-11-22 15:40:00) [10]Еще раз ХЕКС уже строка
Al1 (2004-11-22 14:37:00) [11]
> Есть же замечательные функции в Delphi - BinToHex и HexToBin.
Мне надо строку в Hex а не BinToHex
Rutven (2004-11-22 10:26:00) [12]Что вы мучаетесь.
Есть же замечательные функции в Delphi - BinToHex и HexToBin.
Всё замечательно работает.
Ken (2004-11-22 09:46:00) [13]Ув. мастера, подкиньте пожалуйста пару ссылок на доки где про ето можно прочитать хорошенько! Тоже интересно разобраться!
Спасибо.
Ken (2004-11-22 09:31:00) [14]
> Теперь что такое String?
тип, описывающий строковую переменную
Palladin (2004-11-22 00:18:00) [15]Вот именно. Integer - это тип, описывающий переменную, а Hex - это представлениепоказывающее переменную. Между ними нет никакой связи. Теперь что такое String?
al1 (2004-11-22 00:14:00) [16]
> а что такое integer, можешь мне сказать?
Конечно могу:
Целочисленый тип integer... Диапазон -2147483648..2147483647... Переменная типа Integer занимает в памяти 4 байта (32 бита) ... Ее битовый формат: самый старший бит - знак числа, остальные биты (31 штука) - само число.
Palladin (2004-11-21 22:40:00) [17]это я тебе показал, что такое 16-ти разрядность, и первое представоение это не двоичное представление... это сколькоугодноичное (больше трех)... но оба этих представления 16-тиразрядные
а что такое integer, можешь мне сказать?
al1 (2004-11-21 22:36:00) [18]
> Вас в школе не учили как переводить из одной системы исчисления
> в другую разве?
Еще как учили! Догнали и еще раз научили! :-)
> Например
> 0000000000000003
> или
> 0000000000000101
Это двоичное представление данных! :-)
3 в integer - ето 0х03 в Hex
Palladin (2004-11-21 22:30:00) [19]Во-первых никакое это не 16-ти разрядное представленние данных. Это представления числа в 16-ричной системе исчисления. 16-ти разрядное представление это когда цифра 3 записывается в 16 разрядах чего либо. Например
0000000000000003
или
0000000000000101
Ключевой момент "представление". Представлять может только человек. Для стандартного процессора это выглядит как "есть, нет". Ему до фени какое то там 16-ти разрядное представление, представление в 16-тиричной системе исчисления. Вас в школе не учили как переводить из одной системы исчисления в другую разве?
al1 (2004-11-21 22:23:00) [20]
> Palladin © (21.11.04 22:19) [32]
> Ты сначала подумай, а что такое HEX?
16-ти разрядное представление данных.
Диапазон от 0х00 до 0хFF
(если в int, то от 0 до 255)