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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
14-1085382599
Gorlum
2004-05-24 11:09
2004.06.13
Где же моя анкета?


1-1086077343
Oyster
2004-06-01 12:09
2004.06.13
Поиск в TMemo


3-1084971741
Alex_xxx
2004-05-19 17:02
2004.06.13
Переход от Fox на MySQL: перенос данных, компоненты доступа к MyS


1-1086214858
Win64
2004-06-03 02:20
2004.06.13
Как скомпилить проэкт без запуска Дельфей?


14-1085370471
SammIk
2004-05-24 07:47
2004.06.13
Гребанные вирусы