Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

HEX -> BIN   Найти похожие ветки 

 
Piter ©   (2004-05-27 01:25) [0]

Вот такая задача:
написать функцию, которая принимала бы строковое HEX представление числа, а выдавала само число. Типа:

function Convert(s: string): LongWord;

Применение:

i:= Convert("aac4");
в результате, i=43716

или

i:= Convert("f7");
в результате, i=247

В принципе, для этого существует функция HexToBin, но как же ей неудобно пользоваться! Код у меня получился очень уж зверский! Хочу посмотреть ваши варианты...


 
Гаврила ©   (2004-05-27 01:27) [1]

А вдруг попадется строковое значение, которое больше 32 разрядов ?


 
Gero ©   (2004-05-27 01:29) [2]

Result := StrToInt("$" + HEX);


 
Gero ©   (2004-05-27 01:29) [3]

Result := StrToInt("$" + HEX);


 
Piter ©   (2004-05-27 09:36) [4]

Gero (27.05.04 01:29) [2]

э-э-э... это ты к чему?


 
Piter ©   (2004-05-27 09:37) [5]

Гаврила (27.05.04 01:27) [1]
А вдруг попадется строковое значение, которое больше 32 разрядов ?


ну если я тебя правильно понял - то тогда алгоритм не обязан вернуть правильное значение.

Просто интересно посмотреть на реализацию, она у меня получилась какая-то кривенькая... основная проблема с переворотом чисел
Есть ли элегантное решение?


 
Ega23 ©   (2004-05-27 09:40) [6]

function StrHexToInt(Hex:String):Integer;
begin
Result:=IntToStr("$"+Hex);
end;

Проверку на "дурака" ещё надо сделать, конечно...


 
Anatoly Podgoretsky ©   (2004-05-27 09:42) [7]

StrToInt64 вся функция в одну строку, добавить префикс шестнадцатиричных чисел, задание для непрограммирующих пользователей.


 
Ega23 ©   (2004-05-27 09:44) [8]

Result:=IntToStr("$"+Hex);
StrToInt, конечно. Обшибся...


 
Piter ©   (2004-05-27 09:46) [9]

Gero (27.05.04 01:29) [2]

а-а-а, понял к чему ты... да, элегантно, в общем :)

Но я хотел посмотреть реализацию с помощью HexToBin - нафига эта функция вообще нужна?


 
Piter ©   (2004-05-27 09:47) [10]

Не, не, мужики. Давайте с использованием HexToBin :)


 
Piter ©   (2004-05-27 09:48) [11]

Вчера наткнулся на эту функцию - решил опробовать. А она такая жутко неудобная...


 
Piter ©   (2004-05-27 09:49) [12]

может, я просто чего не понимаю...


 
ламер ©   (2004-05-27 12:08) [13]

ну, если угодно извращаться:

function HexToInt(Value: String): Integer;
var
 Buf: array[0..20] of Char;
begin
 ZeroMemory(@Buf, 21);
 Result := HexToBin(PChar(Value), Buf, 20);
 Result := PInteger(@Buf)^;
end;

но, опять же, если вызвать HexToInt("fffe"), то получим не ожидаемое 65534, а 65279. потому что функция HexToBin рассматривает переданное ей значение не как одно целое число, а как массив чисел, каждое размерностью в один байт.

соответственно, для преобразования чисел, больших чем FF, после вызова HexToBin надо отсортировать массив Buf в обратном порядке.


 
Piter ©   (2004-05-27 20:03) [14]

ламер (27.05.04 12:08) [13]
после вызова HexToBin надо отсортировать массив Buf в обратном порядке


угу, или поменять байты в самом полученном числе... что, возможно, быстрее.
В этом и проблема... но может есть еще какой способ?

ламер (27.05.04 12:08) [13]
Buf: array[0..20] of Char;


имхо, достаточно [0..3]


 
ламер ©   (2004-05-27 20:56) [15]

если ограничивать число 32-мя битами, то:

function HexToInt(Value: String): Integer;
var
 Buf: Integer;
begin
 ZeroMemory(@Buf, 4);
 HexToBin(PChar(Value), @PChar(@Buf)[Length(Value) mod 8 div 2], 4);
 Result := htonl(Buf);
end;


 
Piter ©   (2004-05-27 21:07) [16]

Тьфу
@PChar(@Buf)[Length(Value) mod 8 div 2
а что здесь написано? :)
Я разобрать никак не пойму


 
ламер ©   (2004-05-27 23:05) [17]

> Piter ©   (27.05.04 21:07) [16]

уфф :) дико извиняюсь, конечно же это неверно :)
вообще, это была тщетная попытка ограничить длину строки и найти нужно смещение в буфере за один ход :)

можно сделать так (некрасиво, конечно):

function HexToInt(Value: String): Integer;
begin
 if Length(Value) mod 2 <> 0 then
   Value := "0" + Value;
 if Length(Value) > 8 then
  SetLength(Value, 8);
 ZeroMemory(@Result, 4);
 HexToBin(PChar(Value), @PChar(@Result)[4 - Length(Value) div 2], 4);
 Result := htonl(Result);
end;


4 - Length(Value) div 2 - смещение в "массиве", куда будем записывать результат.



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

Форум: "Потрепаться";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.033 c
1-1086162497
DmitryMN
2004-06-02 11:48
2004.06.13
Контротлная сумма


4-1084036275
Artix
2004-05-08 21:11
2004.06.13
Зазита проги


3-1085392201
Known Unknown
2004-05-24 13:50
2004.06.13
Исключения в UDF


3-1084955594
GIL
2004-05-19 12:33
2004.06.13
Зараз пара запросов - не работают.


1-1085943680
Gestapo
2004-05-30 23:01
2004.06.13
UNICODE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский