Текущий архив: 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.48 MB
Время: 0.032 c