Главная страница
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]

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


 
Rutven ©   (2004-11-22 10:26) [41]

Что вы мучаетесь.
Есть же замечательные функции в Delphi - BinToHex и HexToBin.
Всё замечательно работает.


 
Al1   (2004-11-22 14:37) [42]


> Есть же замечательные функции в Delphi - BinToHex и HexToBin.

Мне надо строку в Hex а не BinToHex


 
Anatoly Podgoretsky ©   (2004-11-22 15:40) [43]

Еще раз ХЕКС уже строка


 
Al1   (2004-11-22 15:54) [44]


> Anatoly Podgoretsky ©   (22.11.04 15:40) [43]
> Еще раз ХЕКС уже строка


и?

var buf : array of byte;
   s : string;
Buf := s; ???

как перевести?


 
Anatoly Podgoretsky ©   (2004-11-22 16:01) [45]

Уже перевел, но только строку в массив байтов, если конечно компилятор не обругает.


 
Al1   (2004-11-22 16:21) [46]

Хорошо а как узнать по символу его код?
(обратный процесс ф-ции Chr)


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


> [46] Al1   (22.11.04 16:21)

> Хорошо а как узнать по символу его код?

Ord()


 
Al1   (2004-11-22 17:13) [48]

Уважаемые мастера, вроде получился у меня какойто результат:

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 17:22) [49]


> [48] Al1   (22.11.04 17:13)

А зачем в функции передавать длины массивов и строк, когда их (длины) можно определять внутри функций?


 
Al1   (2004-11-22 17:28) [50]


> begin...end ©   (22.11.04 17:22) [49]
>
> > [48] Al1   (22.11.04 17:13)
>
> А зачем в функции передавать длины массивов и строк, когда
> их (длины) можно определять внутри функций?


на случай универсальности.... вдруг забудешь укоротить строчку, после работы с ней!... или в буфере допустим тебе надо будет скушать и обработать кусок а не весь!... :-)


 
begin...end ©   (2004-11-22 17:50) [51]


> [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 18:01) [52]


> begin...end ©   (22.11.04 17:50) [51]

Понятно! Буду иметь ввиду! Спасибо.



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

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

Наверх




Память: 0.6 MB
Время: 0.05 c
1-1101314348
Jolik
2004-11-24 19:39
2004.12.05
Не подскажите быстрый алгоритм сравнения символьных...


1-1101063521
redlord
2004-11-21 21:58
2004.12.05
Tstringgrid и размер колонки


14-1100773948
Drakon
2004-11-18 13:32
2004.12.05
Латинские крылатые выражения


1-1100786753
Kray
2004-11-18 17:05
2004.12.05
Реализвать MDI - без поля формы?


1-1099753589
N@St
2004-11-06 18:06
2004.12.05
RTF <---> HTML