![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что-то у меня не работает BinToHex [D7, Win95/98]
DillerXX © (2004-06-26 13:49:00)Пробовал
s:='';
s1:=PChar(BIN.Text);
BinToHex(s1,s,SizeOf(s1));
где s и s1 - это PAnsiChar;
и
s:='';
s1:=PChar(BIN.Text);
BinToHex(s1,s,256);
Всё равно не работает. Вернее работает, но не так... Она возвращает что то типа 0104564654СљH в первом случае и <не буду флудить> во втором...
Что я сделал не так?
YuRock (2004-06-27 18:46:00) [1]Та да :)
begin...end (2004-06-27 17:38:00) [2]
> [12] YuRock © (27.06.04 16:42)
> for i := Len downto 1 do begin
> Pow := 1;
> for j := 1 to Len - i do
> Pow := Pow * 2;
>
> Result := Result + Pow * Cardinal(StrToInt(sBin[i]));
> end;
for I := Len downto 1 do
Result := Result + (1 shl (Len - I)) * Cardinal(StrToInt(sBin[I]));
:)
YuRock (2004-06-27 16:44:00) [3]Пример использования:
ShowMessage(IntToStr(BinToCardinal('1100100100')));
YuRock (2004-06-27 16:42:00) [4]Пойми, что 1011 - это не 11 в десятичной системе, это одна тысяча ониннадцать!
В Delphi можно писать десятиричные константы (просто пишешь цифры) и шестнадцатиричные (перед константой пиши $).
Двоичные так просто нельзя. Если тебе надо перевести бинарное число в десятичное - вот пример ф-ции:
function BinToCardinal(sBin: String): Cardinal;
var
Len, i, j, Pow: Cardinal;
begin
Result := 0;
Len := Length(sBin);
for i := 1 to Len do
if not (sBin[i] in ['0', '1']) then Exit;
for i := Len downto 1 do begin
Pow := 1;
for j := 1 to Len - i do
Pow := Pow * 2;
Result := Result + Pow * Cardinal(StrToInt(sBin[i]));
end;
end;
DillerXX (2004-06-27 16:22:00) [5]Ну ему может и всё равно, а вот мне нет! Часть моей программы заключается в том, что она переводит из бинарной системы в десятиричную. Но как я понял, в делфи нет функции типа BinToDec. Поэтому я решил перевисти в шестнадцатиричную систему, а потом в десятичную. Но функция думает, что ей дают десятичное число! И в результате получается не правельный результат...
YuRock (2004-06-27 15:31:00) [6]Бинарное, десятичное, восьмиричное, шестнадцатиричное...
Какая разница? Компилятору все-равно, какое ты число туда передаешь.
Все в конечном итоге - бинарное...
DillerXX (2004-06-27 12:03:00) [7]Это не то! Я не знаю как так получилось, но она переводит в HEX не бинарное значение, а десятичное! Тоесть, по идее, если я хочу перевести в HEX систему 1011 то должно болучиться B. Но эта функция переводит это как F303, т.е. она думает что это десятичное число! Можешь написать, чтобы она воспринимала как двоичное?
YuRock (2004-06-26 19:42:00) [8]Единственное, что: советую добавить сразу после трая строку
pBuf[dwDataBytesCount * 2 + 1] := #0;
YuRock (2004-06-26 19:39:00) [9]Ну вот рабочий вариант:
function BinToHexString(pData: Pointer; dwDataBytesCount: Cardinal): String;
var
pBuf: PChar;
begin
Result := '';
if dwDataBytesCount = 0 then Exit;
pBuf := AllocMem(dwDataBytesCount * 2 + 1);
try
BinToHex(pData, pBuf, dwDataBytesCount);
Result := String(pBuf);
finally
FreeMem(pBuf);
end;
end;
Пример использования:
var
Temp: Integer;
begin
Temp := 5;
ShowMessage(BinToHexString(@Temp, SizeOf(Temp)));
end;
DillerXX (2004-06-26 19:21:00) [10]Не работает :( Можете кто-нибудь написать сдесь РАБОТАЮЩИЙ код?
DillerXX (2004-06-26 16:56:00) [11]Блин, всё равно ничего не получается :(( Вот пишу:
buf:=PChar(BIN.Text);
l:=length(buf);
text:=AllocMem(L*2);
BinToHex(Buf,Text,l);
SetString(s, Text, StrLen(Text));
И всё равно она выдаёт не то(301330133013). Где что не так??
Palladin (2004-06-26 14:20:00) [12]Да выдели же память, наконец!
DillerXX (2004-06-26 14:10:00) [13]Значит мне надо писать BinToHex(s1,s,SizeOf(s1)*2)?? Так не работает...
KilkennyCat (2004-06-26 13:58:00) [14]Text needs to point to a sequence of characters that has at least 2*BufSize bytes because each hexadecimal character represents two bytes.
Palladin (2004-06-26 13:57:00) [15]А в справку заглядывал?