Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизЧто-то у меня не работает BinToHex Найти похожие ветки
← →
DillerXX © (2004-06-26 13:49) [0]Пробовал
s:="";
s1:=PChar(BIN.Text);
BinToHex(s1,s,SizeOf(s1));
где s и s1 - это PAnsiChar;
и
s:="";
s1:=PChar(BIN.Text);
BinToHex(s1,s,256);
Всё равно не работает. Вернее работает, но не так... Она возвращает что то типа 0104564654СљH в первом случае и <не буду флудить> во втором...
Что я сделал не так?
← →
Palladin © (2004-06-26 13:57) [1]А в справку заглядывал?
← →
KilkennyCat © (2004-06-26 13:58) [2]Text needs to point to a sequence of characters that has at least 2*BufSize bytes because each hexadecimal character represents two bytes.
← →
DillerXX © (2004-06-26 14:10) [3]Значит мне надо писать BinToHex(s1,s,SizeOf(s1)*2)?? Так не работает...
← →
Palladin © (2004-06-26 14:20) [4]Да выдели же память, наконец!
← →
DillerXX © (2004-06-26 16:56) [5]Блин, всё равно ничего не получается :(( Вот пишу:
buf:=PChar(BIN.Text);
l:=length(buf);
text:=AllocMem(L*2);
BinToHex(Buf,Text,l);
SetString(s, Text, StrLen(Text));
И всё равно она выдаёт не то(301330133013). Где что не так??
← →
DillerXX © (2004-06-26 19:21) [6]Не работает :( Можете кто-нибудь написать сдесь РАБОТАЮЩИЙ код?
← →
YuRock © (2004-06-26 19:39) [7]Ну вот рабочий вариант:
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;
← →
YuRock © (2004-06-26 19:42) [8]Единственное, что: советую добавить сразу после трая строку
pBuf[dwDataBytesCount * 2 + 1] := #0;
← →
DillerXX © (2004-06-27 12:03) [9]Это не то! Я не знаю как так получилось, но она переводит в HEX не бинарное значение, а десятичное! Тоесть, по идее, если я хочу перевести в HEX систему 1011 то должно болучиться B. Но эта функция переводит это как F303, т.е. она думает что это десятичное число! Можешь написать, чтобы она воспринимала как двоичное?
← →
YuRock © (2004-06-27 15:31) [10]Бинарное, десятичное, восьмиричное, шестнадцатиричное...
Какая разница? Компилятору все-равно, какое ты число туда передаешь.
Все в конечном итоге - бинарное...
← →
DillerXX © (2004-06-27 16:22) [11]Ну ему может и всё равно, а вот мне нет! Часть моей программы заключается в том, что она переводит из бинарной системы в десятиричную. Но как я понял, в делфи нет функции типа BinToDec. Поэтому я решил перевисти в шестнадцатиричную систему, а потом в десятичную. Но функция думает, что ей дают десятичное число! И в результате получается не правельный результат...
← →
YuRock © (2004-06-27 16:42) [12]Пойми, что 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;
← →
YuRock © (2004-06-27 16:44) [13]Пример использования:
ShowMessage(IntToStr(BinToCardinal("1100100100")));
← →
begin...end © (2004-06-27 17:38) [14]
> [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 18:46) [15]Та да :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.161 c