Главная страница
    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.027 c
4-1084129701
Lui
2004-05-09 23:08
2004.06.13
Картинка из dll


3-1084915838
Yagoda
2004-05-19 01:30
2004.06.13
Помогите с SocketConnection


1-1085587061
vajo
2004-05-26 19:57
2004.06.13
Заставка


3-1084856075
Yus
2004-05-18 08:54
2004.06.13
Редактирование связанных таблиц


14-1085157364
Arm79
2004-05-21 20:36
2004.06.13
Помогите разгадать ...ЦО





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский