Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Hex в String и наоборот [D7, WinXP]


Страницы:   1 2 3

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)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо