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

Вниз

HexToStr   Найти похожие ветки 

 
kiwooo   (2006-08-15 13:16) [0]

Привет! Искал в инетрнете способы перевода Hex - значения в Str элемент. Т.е. например
Hex := "757475";
HStr := HexToStr(Hex);


Итог  HStr = "utu"

Решение проблемы-то я нашел, но интересует, как быстрее и лучше сделать эту операцию (HexToStr).


 
Джо ©   (2006-08-15 13:19) [1]

> HexToStr

Что это за функция такая, HexToStr?


 
Джо ©   (2006-08-15 13:19) [2]

И что она должна делать-то?


 
Германн ©   (2006-08-15 13:24) [3]


HStr:="";
for i:=0 to (Length(Hex) div 2) - 1 do
 HStr:=HStr+Chr(Byte(StrToInt("$"+Copy(Hex(i*2+1,2)))));


 
begin...end ©   (2006-08-15 14:04) [4]

Если версия Delphi позволяет, используйте HexToBin.


 
Anatoly Podgoretsky ©   (2006-08-15 16:42) [5]

hex и так уже строка.


 
tesseract ©   (2006-08-15 16:46) [6]

uses SysUtils

hex:=$7575
Hstr:=IntToHex(hex,4);


 
Пусик ©   (2006-08-15 20:35) [7]

> tesseract ©   (15.08.06 16:46) [6]

hex:=$7575
Hstr:=IntToHex(hex,4);


Это к чему? Совсем далеко от ответа.

>kiwooo   (15.08.06 13:16)

Вот простенький пример:

function HexToStr(s:pchar):string;
begin
   SetLength(Result,StrLen(s)div 2);
   SetLength(Result,HexToBin(s, @result[1],StrLen(s)div 2));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Hex,Hstr:string;
begin
Hex := "757475";
HStr := HexToStr(pchar(Hex));
Label1.Caption:=HStr;
end;


 
Kolan ©   (2006-08-15 20:44) [8]


> Пусик ©   (15.08.06 20:35) [7]

Ну и что это делает?

Врный ответ:
Anatoly Podgoretsky ©   (15.08.06 16:42) [5]


 
Пусик ©   (2006-08-15 20:48) [9]


> Kolan ©   (15.08.06 20:44) [8]
> > Пусик ©   (15.08.06 20:35) [7]Ну и что это делает?


А теперь внимательно прочитай вопрос. Можешь несколько раз.


 
Пусик ©   (2006-08-15 20:50) [10]

>Kolan ©   (15.08.06 20:44) [8]

ps. [5] - ответ неверный.


 
Kolan ©   (2006-08-15 21:01) [11]


> Пусик ©   (15.08.06 20:50) [10]

Неплохо бы человеку обяснить, что он неверно задал вопрос..


> kiwooo   (15.08.06 13:16)

1. Нех - это и так строка.
2. А вом нужно Нех значение (например 75) превратить в число см. HexToBin
3. А затем полученое число преобразовать в символ см. Chr()


 
Kolan ©   (2006-08-15 21:03) [12]


> SetLength(Result,StrLen(s)div 2);

А если я буду писать 075?

С таким же успехом можно было предложить вариант:
function HexToStr: string;
begin
 Result := "utu"
end;

:)


 
Пусик ©   (2006-08-15 21:07) [13]


> А если я буду писать 075?


Обрати внимание, что 075 - не текстовый тип


 
Kolan ©   (2006-08-15 21:15) [14]

"075" это текстовый :)


 
Пусик ©   (2006-08-15 21:21) [15]


> Kolan ©   (15.08.06 21:15) [14]
> "075" это текстовый :)


И?
1. Правильность входных данных на совести автора.
2. Я знаю, что Земля не круглая, а Черное море не черное. И что?


> Kolan ©   (15.08.06 21:01) [11]
> > Пусик ©   (15.08.06 20:50) [10]Неплохо бы человеку обяснить,
>  что он неверно задал вопрос..> kiwooo   (15.08.06 13:16)
1. Нех - это и так строка.
2. А вом нужно Нех значение (например 75) превратить в число см. HexToBin
3. А затем полученое число преобразовать в символ см. Chr()


1. Так точно. Только зачем это повторять?
2. Код из [7] делает это без преобразования.
3. См. п. 2.


 
Kolan ©   (2006-08-15 21:26) [16]


> 2. Код из [7] делает это без преобразования.

Он то делает, но вводит в заблуждение автора. И оставит его думать, что нех и строка разные вещи, а это одно и тоже;

К томуже понимание того как это ракботает позволит дать ф-ции понятное название, а не бредовое HexToStr...


 
Пусик ©   (2006-08-15 21:34) [17]


> Kolan ©   (15.08.06 21:26) [16]
> > 2. Код из [7] делает это без преобразования.Он то делает,
>  но вводит в заблуждение автора. И оставит его думать, что
> нех и строка разные вещи, а это одно и тоже;


Автор прекрасно понимает это.
Еще раз внимательно перечитай вопрос. И не надо предлагать:
1. неэффективных методов(подобных [3] и [11]) как единственно верных;
2. неверных, подобно [5];
3. откровенно бредовых, как в [6].


 
Kolan ©   (2006-08-15 21:40) [18]

Пффф, то есть по вашему Hex - это не строка(в Delphi)? Так?

function IntToHex(Value: Integer; Digits: Integer): string; overload;

...


 
Virgo_Style ©   (2006-08-15 21:43) [19]

Такое чувство, что надо что-то вроде
IntToStr( StrToInt("$"+SomeHexString) );

Пусик ©   (15.08.06 21:34) [17]
[5] абсолютно верен в контексте [0]


 
Kolan ©   (2006-08-15 21:47) [20]


> Kolan ©   (15.08.06 21:40) [18]

Кстати заметте, что в IntToHex учитывается, что строка содержащая Нех может трактоватьзя по разному: Digits: Integer


 
tesseract ©   (2006-08-15 21:58) [21]

> [17] Пусик ©   (15.08.06 21:34)


Пусик решил опять всех покозлить. Опять убеждаюсь в правоте той статьи.

Только попробуй доказать что $7575 Delphi не воспримет как шестнадцетиричное значение.

> IntToStr( StrToInt("$"+SomeHexString) );


Я так и делаю, если значение строковое.  


> Пффф, то есть по вашему Hex - это не строка(в Delphi)? Так?


HEX не строка - а целое число, так мне доходчиво доказал преподователь по теории чисел в 1998 году.

При работе, например, с оборудованием оч полезно inttohex.


 
Anatoly Podgoretsky ©   (2006-08-15 21:59) [22]

За это время автор ни разу голос не подал.


 
Шпиён   (2006-08-15 22:15) [23]

> HEX не строка - а целое число,

У автора вопроса переменная  Hex - именно строка.
см. [0]

> Hex := "757475";
> HStr := HexToStr(Hex);
>
> Итог  HStr = "utu"


Как с помощью
> tesseract ©   (15.08.06 16:46) [6]
> uses SysUtils
>
> hex:=$7575
> Hstr:=IntToHex(hex,4);

получается ожидаемый результат "utu" ?


 
tesseract ©   (2006-08-15 22:40) [24]

> [23] Шпиён   (15.08.06 22:15)


перегруз у меня :-)

тогда присоединяюсь к [2].


 
Kolan ©   (2006-08-15 22:59) [25]


> доказал преподователь по теории чисел в 1998 году

Ну вообщем Hex - система счисления.

Я имел в виду что в Delphi нет формата для таких чисел(вроде Double, Intger) а используется string.. Мож я и не прав, но впрос что должна делать HexToStr у меня вознит сразу...


 
Шпиён   (2006-08-15 23:04) [26]


> тогда присоединяюсь к [2].

По моему, из [0] четко видно, что должна делать функция HexToStr -)
Присоединяюсь к [3], [4] и [7]
[3] - если версия Delphi не позволяет. Хотя для достаточно длинной строки я бы использовал код HexToBin из более свежих версий Delphi.
Delphi 6:

function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
const
 Convert: array["0".."f"] of SmallInt =
   ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
    -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,10,11,12,13,14,15);
var
 I: Integer;
begin
 I := BufSize;
 while I > 0 do
 begin
   if not (Text[0] in ["0".."f"]) or not (Text[1] in ["0".."f"]) then Break;
   Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
   Inc(Buffer);
   Inc(Text, 2);
   Dec(I);
 end;
 Result := BufSize - I;
end;



 
Пусик ©   (2006-08-15 23:12) [27]

> tesseract ©   (15.08.06 22:40) [24]
> tesseract ©   (15.08.06 21:58) [21]

...Пусик решил опять всех покозлить...
перегруз у меня :-)


Тогда не надо проблемы с больной головы на здоровую перекладывать(т.е. на автора). Из топика всё ясно и понятно - что имел ввиду автор. Если кто-то не в состоянии понять вопроса, то автор в том не виноват.


> Kolan ©   (15.08.06 22:59) [25]
> > доказал преподователь по теории чисел в 1998 годуНу вообщем
> Hex - система счисления.


Из топика всё ясно и понятно - что имел ввиду автор. Если кто-то не в состоянии понять вопроса, то автор в том не виноват.


 
Kolan ©   (2006-08-15 23:37) [28]


> Пусик решил опять всех покозлить.

Это он? 8-/


 
Германн ©   (2006-08-16 00:24) [29]


> Хотя для достаточно длинной строки я бы использовал код
> HexToBin из более свежих версий Delphi.

Ну так уж если сказал assembler, так и приводи ассемблерный код. Иначе "злобн(ый)ая Пусик опять скажет о "неэффективности". :-)


 
Шпиён   (2006-08-16 00:43) [30]


> Германн ©   (16.08.06 00:24) [29]

хочешь?
Ассемблерный вариант в D6 закомментирован -)

Delphi5 (Classes.pas)


function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer; assembler;
asm
       PUSH    ESI
       PUSH    EDI
       PUSH    EBX
       MOV     ESI,EAX
       MOV     EDI,EDX
       MOV     EBX,EDX
       MOV     EDX,0
       JMP     @@1
@@0:    DB       0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
       DB      -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
       DB      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
       DB      -1,10,11,12,13,14,15
@@1:    LODSW
       CMP     AL,"0"
       JB      @@2
       CMP     AL,"f"
       JA      @@2
       MOV     DL,AL
       MOV     AL,@@0.Byte[EDX-"0"]
       CMP     AL,-1
       JE      @@2
       SHL     AL,4
       CMP     AH,"0"
       JB      @@2
       CMP     AH,"f"
       JA      @@2
       MOV     DL,AH
       MOV     AH,@@0.Byte[EDX-"0"]
       CMP     AH,-1
       JE      @@2
       OR      AL,AH
       STOSB
       DEC     ECX
       JNE     @@1
@@2:    MOV     EAX,EDI
       SUB     EAX,EBX
       POP     EBX
       POP     EDI
       POP     ESI
end;


 
Пусик ©   (2006-08-16 00:52) [31]


> Германн ©   (16.08.06 00:24) [29]


Код хоть и неоптимальный, но вполне имеет право на жизнь. Наглядный и простой.
Там, где нет особых требований к скорости выполнения кода, вполне подойдет.

PS.
Я не "злобная". Я белая и пушистая, пока меня не трогают.


 
Германн ©   (2006-08-16 01:01) [32]


> Шпиён   (16.08.06 00:43) [30]
>
>
> > Германн ©   (16.08.06 00:24) [29]
>
> хочешь?
> Ассемблерный вариант в D6 закомментирован -)
>

Да я то не хочу. Но раз уж ты назвался груздем, так и полезай туда. :-) Залез. Вижу.


 
Германн ©   (2006-08-16 01:06) [33]


> Пусик ©   (16.08.06 00:52) [31]
>
>
> > Германн ©   (16.08.06 00:24) [29]
>
>
> Код хоть и неоптимальный, но вполне имеет право на жизнь.
>  Наглядный и простой.
> Там, где нет особых требований к скорости выполнения кода,
>  вполне подойдет.

Ну так приведи "оптимальный" код. Никто не будет возражать.

>
> PS.
> Я не "злобная". Я белая и пушистая, пока меня не трогают.
>

Дык я и не считал тебя злобной! :-)
Это всё

> tesseract ©   (15.08.06 21:58) [21]

и

> Kolan ©   (15.08.06 23:37) [28]


 
Пусик ©   (2006-08-16 01:08) [34]


> Германн ©   (16.08.06 01:06) [33]
> > Пусик ©   (16.08.06 00:52) [31]> > > > Германн ©   (16.
> 08.06 00:24) [29]> > > Код хоть и неоптимальный, но вполне
> имеет право на жизнь.>  Наглядный и простой.> Там, где нет
> особых требований к скорости выполнения кода,>  вполне подойдет.
> Ну так приведи "оптимальный" код. Никто не будет возражать.
>


Так в [7] код достаточно оптимальный. Хотя вот сейчас думаю, как можно еще оптимизировать.


 
Шпиён   (2006-08-16 01:11) [35]


> Хотя вот сейчас думаю, как можно еще оптимизировать

Ну, для начала я бы не вычислял StrLen(s)div 2 дважды. -)


 
Шпиён   (2006-08-16 01:22) [36]

И еще передал бы в HexToStr не PChar, а const строку, и вообще не "вычислял" бы длину буфера таким способом -)
Попробовал бы воспользоваться Lenght (более универсальный способ) или получить длину строки примерно как integer(pointer(integer(pointer(s))-4)^)
И, возможно, использовал бы сдвиг вправо вместо деления нацело -)


 
Шпиён   (2006-08-16 01:40) [37]

Что-то вроде такого:

function HexToStr(const s:string):string;
var Len:integer;
begin
  Len:=integer(pointer(integer(pointer(s))-4)^) shr 1;
  SetLength(Result,Len);
  SetLength(Result,HexToBin(pchar(s), pchar(result), Len));
end;


 
KilkennyCat ©   (2006-08-16 03:07) [38]

Есть способ еще проще.


 
Пусик ©   (2006-08-16 03:22) [39]


> KilkennyCat ©   (16.08.06 03:07) [38]
> Есть способ еще проще.


Подавай его сюда.
Если проще и быстрее, то совсем хорошо-)


 
Пусик ©   (2006-08-16 03:24) [40]


> KilkennyCat ©   (16.08.06 03:07) [38]


По крайней мере, код Шпиёна из [37] весьма быстр.



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

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

Наверх




Память: 0.57 MB
Время: 0.042 c
1-1153638445
Blacksus
2006-07-23 11:07
2006.09.03
Проблема с ShareMem


3-1150956012
-=alive=-
2006-06-22 10:00
2006.09.03
Перекодировать DBF таблицу


2-1155732275
XTD
2006-08-16 16:44
2006.09.03
Передать параметры WEB странице.


2-1155197321
o_serg
2006-08-10 12:08
2006.09.03
редактор ListView


1-1153423236
rlzz
2006-07-20 23:20
2006.09.03
Как вытащить файл из ресурса ???