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?


Palladin   (2004-11-21 22:19:00) [21]

Ты сначала подумай, а что такое HEX?


begin...end   (2004-11-21 22:18:00) [22]


> [30] al1   (21.11.04 22:17)

Теперь все советы только после полной предоплаты :-)


al1   (2004-11-21 22:17:00) [23]


> Он себя то понять не может...

Я еще не до такой степени напился чтоб себя не понимать! :-)

А вот насчет конвертирования Hex в строку и наоборот - перерыл кучу документации... везде в скольз ето обьясняеться... толком без примеров... и мало чего понятно :-( Может кто-то подскажет где мне про ето все хорошенько почитать? Буду благодарен! :-)


Palladin   (2004-11-21 22:12:00) [24]

Нет, не видать. Вряд ли он настолко толстые тонкие намеки понимает :) Он себя то понять не может...


al1   (2004-11-21 22:12:00) [25]


> Мда... Не видать мне пива... :-(

Разве что по почте! Страна? Город? :-)


begin...end   (2004-11-21 22:10:00) [26]

Мда... Не видать мне пива... :-(


begin...end   (2004-11-21 22:01:00) [27]


> al1


Цикл while можно и на for заменить, т.е. вместо этого:

I := 0;
while (I <= High(Buf)) do
begin
 Buf[I] := StrToInt('$' + Copy(SHex, I * 2 + 1, 2));
 Inc(I)
end


можно так:

for I := 0 to High(Buf) do
 Buf[I] := StrToInt('$' + Copy(SHex, I * 2 + 1, 2))


begin...end   (2004-11-21 21:46:00) [28]


> [24] al1   (21.11.04 21:42)


> а как выставить сразу нужный размер Buf?

Нужный размер Buf выставляется в строке: "SetLength(Buf, Len div 2);".

P.S. Можно даже Балтику 3.


al1   (2004-11-21 21:42:00) [29]

Спасибо. Вроде бы работает!
Такой вопрос:
while (I <= High(Buf)) do

а как выставить сразу нужный размер Buf?


begin...end   (2004-11-21 21:36:00) [30]


> al1


Если ты имеешь в виду SHex, то тогда можно так:

var
 Buf: array of Byte;
 SHex: String;
 I, Len: Integer;

begin
 // SHex := '6D6F757365';
 Len := Length(SHex);
 if (Len > 0) and (Len mod 2 = 0) then
 begin
   SetLength(Buf, Len div 2);
   I := 0;
   while (I <= High(Buf)) do
   begin
     Buf[I] := StrToInt('$' + Copy(SHex, I * 2 + 1, 2));
     Inc(I)
   end
 end
end.


Работает, но насчёт оптимальности - не знаю... Хочу спать, соображаю плохо...

P.S. Люблю Балтику 7.


begin...end   (2004-11-21 21:16:00) [31]


> [21] al1   (21.11.04 21:06)


> А можешь еще подсказать кодом на обратный процесс?
> (Из String в Buf)

Из какого String - из S или SHex?


al1   (2004-11-21 21:06:00) [32]

Спасибо.

> begin...end

А можешь еще подсказать кодом на обратный процесс?
(Из String в Buf)


SergP   (2004-11-21 20:52:00) [33]


>palva ©   (21.11.04 19:29) [8][Ответить]
> Хотя тут тоже проблема с ведущим нулем.


В IntToHex нет проблемы с ведущим нулем.


Anatoly Podgoretsky   (2004-11-21 20:33:00) [34]

Palladin ©   (21.11.04 19:48) [15]
Мягкая завуалированая форма - код давай.


SergP   (2004-11-21 20:32:00) [35]

А... Ну да.. Про SHEX еще забыл... Но

> begin...end ©   (21.11.04 20:23) [16]

тебе уже раньше меня ответил...


SergP   (2004-11-21 20:30:00) [36]

Что-то типа этого, чтоли?

function HerZnaetChtoToString(var MyBuf:TMyArray ):string;
var
 i:integer;
begin
 setlength(result,High(MyBuf)-Low(MyBuf)+1);
 for i:=low(MyBuf) to High(MyBuf) do
 result[i-low(MyBuf)+1] := chr(MyBuf[i]);
end;

В работе не пробовал. Мог и ошибиться где-нить....


begin...end   (2004-11-21 20:23:00) [37]


> al1


var
 Buf: array of Byte;
 S, SHex: String;
 I: Integer;

begin
 S := '';
 SHex := '';
 for I := Low(Buf) to High(Buf) do
 begin
   S := S + Chr(Buf[I]);
   SHex := SHex + Format('%x', [Buf[I]])
 end
end.


Palladin   (2004-11-21 19:48:00) [38]

чего вы к парню пристали? просто скажите ответ и все :)


begin...end   (2004-11-21 19:39:00) [39]


> [11] begin...end ©   (21.11.04 19:36)

Нет, это я не то сказал. У тебя же изначально есть массив, вот для каждого элемента вызывай функцию Chr(), получишь соответствующий символ; а также для каждого элемента вызывай IntToHex() или Format(), получишь шестнадцатеричное представление байта; ну и так для всех элементов.


al1   (2004-11-21 19:36:00) [40]


> begin...end ©   (21.11.04 19:34) [10]

опечатался:
Buf - 5 байт
и вместо ы я имел ввиду S:
(S у меня получиться длиной в 5 символов а SHex длиной в 10 символов)


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

Наверх

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