![]() |
| ||
|
|
Новости |
Поиск |
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?
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 символов)