Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Hex в String и наоборот   Найти похожие ветки 

 
Al1   (2004-11-21 18:35) [0]

Мастера подскажите пожалуйста как из Hex переводить в String и наоборот. Есть у меня например некая последовательность байт: Buf: array of Byte

мне надо етот Buf перевести в строку, содержашую его HEX формат
s : string , где длина строки получиться равной длине Buf * 2 и обратно!

Может есть некие компоненты, с помошью которых можно было бы легко оперировать с HEX?


 
Pat ©   (2004-11-21 18:40) [1]

См функцию format()


 
al1   (2004-11-21 18:56) [2]


> Pat

И как мне с ней работать? помоему format не будет решением [0]


 
Anatoly Podgoretsky ©   (2004-11-21 19:08) [3]

Al1   (21.11.04 18:35)  
Нет необходимости, Hex уже String, соответственно и наоборот.
Но в самой теме почему то уже говоришь про байты.


 
begin...end ©   (2004-11-21 19:12) [4]


> [2] al1   (21.11.04 18:56)

А работать так: Format("%x", [IntegerValue]).


 
SergP ©   (2004-11-21 19:22) [5]


> Мастера подскажите пожалуйста как из Hex переводить в String
> и наоборот.


1.) Из HEX в String (вернее из integer, byte и других целочисленных типов в string в HEX формате)
 a) function IntToHex(Value: Integer; Digits: Integer): string;
 b) format (уже в предідущих постах объяснили)

2.) Обратно
  function StrToInt(const S: string): Integer;

пример:   MyInteger:=StrToInt("$"+MyString);


 
palva ©   (2004-11-21 19:25) [6]

где длина строки получиться равной длине Buf * 2 и обратно

Ага, кажется, я понял. Каждый байт нужно представить в виде двух шестнадцатиричных цифр. Тогда можно так:

s := "";
for i := 0 to ...
begin
 s := s + IntToHex(Buf[i])
end


 
Anatoly Podgoretsky ©   (2004-11-21 19:27) [7]

palva ©   (21.11.04 19:25) [6]
Хоть бы не приводил ошибочного кода


 
palva ©   (2004-11-21 19:29) [8]

Я не прав, не
IntToHex(Buf[i])
а как написал SergP
IntToHex(Buf[i], 2)
Хотя тут тоже проблема с ведущим нулем. Наверно без Format здесь не обойтись, хотя лично я написал бы непосредственно преобразование


 
al1   (2004-11-21 19:29) [9]

нет мне надо чуть другое:
есть у меня Buf: array of Byte, в котором имееться 6 байт: 6D6F757365 а мне надо например в s:String получить из етого слово mouse и в SHex: string получить "6D6F757365". (ы у меня получиться длиной в 5 символов а SHex длиной в 10 символов)

Т.е мне надо знать как мне можно конвертировать из Buf в String и в StringinHex и наоборот!


 
begin...end ©   (2004-11-21 19:34) [10]


> [9] al1   (21.11.04 19:29)

Чего-то у тебя не так в консерватории, где там 6 байт, я только 5 вижу.


 
begin...end ©   (2004-11-21 19:36) [11]


> [9] al1   (21.11.04 19:29)

Ну а вообще обрабатывай строку в цикле, по 2 символа, каждый кусочек переводи в Byte с помощью StrToInt, а потом можно получить символ, соответствующий этому коду, с помощью Chr().


 
KilkennyCat ©   (2004-11-21 19:36) [12]


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


у него впереди 00 :)


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


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

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


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


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

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


 
Palladin ©   (2004-11-21 19:48) [15]

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


 
begin...end ©   (2004-11-21 20:23) [16]


> 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.


 
SergP ©   (2004-11-21 20:30) [17]

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

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;

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


 
SergP ©   (2004-11-21 20:32) [18]

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

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

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


 
Anatoly Podgoretsky ©   (2004-11-21 20:33) [19]

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


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


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


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


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

Спасибо.

> begin...end

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


 
begin...end ©   (2004-11-21 21:16) [22]


> [21] al1   (21.11.04 21:06)


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

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


 
begin...end ©   (2004-11-21 21:36) [23]


> 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.


 
al1   (2004-11-21 21:42) [24]

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

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


 
begin...end ©   (2004-11-21 21:46) [25]


> [24] al1   (21.11.04 21:42)


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

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

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


 
begin...end ©   (2004-11-21 22:01) [26]


> 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 22:10) [27]

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


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


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

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


 
Palladin ©   (2004-11-21 22:12) [29]

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


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


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

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

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


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


> [30] al1   (21.11.04 22:17)

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


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

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


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


> Palladin ©   (21.11.04 22:19) [32]
> Ты сначала подумай, а что такое HEX?


16-ти разрядное представление данных.
Диапазон от 0х00 до 0хFF
(если в int, то от 0 до 255)


 
Palladin ©   (2004-11-21 22:30) [34]

Во-первых никакое это не 16-ти разрядное представленние данных. Это представления числа в 16-ричной системе исчисления. 16-ти разрядное представление это когда цифра 3 записывается в 16 разрядах чего либо. Например
0000000000000003
или
0000000000000101

Ключевой момент "представление". Представлять может только человек. Для стандартного процессора это выглядит как "есть, нет". Ему до фени какое то там 16-ти разрядное представление, представление в 16-тиричной системе исчисления. Вас в школе не учили как переводить из одной системы исчисления в другую разве?


 
al1   (2004-11-21 22:36) [35]


> Вас в школе не учили как переводить из одной системы исчисления
> в другую разве?

Еще как учили! Догнали и еще раз научили! :-)


> Например
> 0000000000000003
> или
> 0000000000000101

Это двоичное представление данных! :-)
3 в integer - ето 0х03 в Hex


 
Palladin ©   (2004-11-21 22:40) [36]

это я тебе показал, что такое 16-ти разрядность, и первое представоение это не двоичное представление... это сколькоугодноичное (больше трех)... но оба этих представления 16-тиразрядные

а что такое integer, можешь мне сказать?


 
al1   (2004-11-22 00:14) [37]


> а что такое integer, можешь мне сказать?

Конечно могу:
Целочисленый тип integer... Диапазон -2147483648..2147483647... Переменная типа Integer занимает в памяти 4 байта (32 бита) ... Ее битовый формат: самый старший бит - знак числа, остальные биты (31 штука) - само число.


 
Palladin ©   (2004-11-22 00:18) [38]

Вот именно. Integer - это тип, описывающий переменную, а Hex - это представление показывающее переменную. Между ними нет никакой связи. Теперь что такое String?


 
Ken   (2004-11-22 09:31) [39]


> Теперь что такое String?

тип, описывающий строковую переменную


 
Ken   (2004-11-22 09:46) [40]

Ув. мастера, подкиньте пожалуйста пару ссылок на доки где про ето можно прочитать хорошенько! Тоже интересно разобраться!
Спасибо.



Страницы: 1 2 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.04 c
1-1100579612
FastByte
2004-11-16 07:33
2004.12.05
Как создать таблицу в Word из Delphi ?


1-1101209423
Артем К.
2004-11-23 14:30
2004.12.05
Объединение ячеек в Excel при помощи Delphi?


1-1100808505
xkiller
2004-11-18 23:08
2004.12.05
Как программно свернуть popupmenu?


3-1099652399
Janb
2004-11-05 13:59
2004.12.05
Что выбрать? Или как сделать?


1-1101219072
jenbond
2004-11-23 17:11
2004.12.05
Экспорт в doc or rtf из FastReport