![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Представить байт в двоичном виде [D5, D6, D7, D2005, NT4, 2000, XP, 2003]
Beginer2 © (2006-09-01 18:32:00)Какой функцией можно получить байт в двоичном представлении? Например имеем байт ASCII с кодом 65, нужно получить его в виде: 01001101 (двоичный код приведен от балды). Необязательно (а скорее даже желательно) сделать не на делфи, а на TP7
Desdechado (2006-09-02 18:49:00) [1]следующий вопрос будет про слово или двойное слово
и про порядок байтов в нем
Anatoly Podgoretsky (2006-09-02 18:12:00) [2]Потому что понятие BIN расплывчатое, это может быть и двоичное представление, но чаще внутреннее - любые двоичные данные.
begin...end (2006-09-02 17:47:00) [3]> Eraser © (02.09.06 15:44) [26]
См. [13]. HexToBin/BinToHex не предназначены для преобразования в строковое двоичное представление (или из него). Они преобразуют строку, содержащую шестнадцатеричное представление некоторой последовательности байт, в набор байт, соответствующий этому представлению (и наоборот).
Eraser (2006-09-02 15:44:00) [4]> [7] Beginer2 (01.09.06 19:34)
> Честно говоря был уверен что есть готовая функция.
IntToBin из IdGlobalProtocols или
IntToHex, HexToBin.
> А как сделать обратное преобразование? :)
BinToHex, StrToInt.
Fay (2006-09-02 15:27:00) [5]2 default © (02.09.06 8:30) [23]
> код инженерного вида и переключателей Dec, Bin ещё подсмотрел:)
Просто взял из ресурсов. Как и класс окна 8)
DprYg (2006-09-02 09:16:00) [6]
> Beginer2
Весь код пишется элементарно, если знать системы
счисления. Советую изучить. Без них - никуда.
default (2006-09-02 08:30:00) [7]Fay © (02.09.06 01:39) [22]
забавно!
код инженерного вида и переключателей Dec, Bin ещё подсмотрел:)
осталось только ещё подсоединиться к удалённому серверу где-нибудь на краешке земли и попросить его выполнить требуемые сверхинтеллектуальные операции перевода, алгоритмы которых строго засекречены
Fay (2006-09-02 01:39:00) [8]Слобал 8)
function CoolConvert(s : string; bDec2Bin : Boolean) : string;
procedure _RunCalc;
var
si : TStartupInfo;
pi : TProcessInformation;
begin
FillChar(pi, SizeOf(pi), 0);
FillChar(si, SizeOf(si), 0);
si.cb := SizeOf(si);
if not CreateProcess(nil, 'calc.exe', nil, nil, False, 0, nil, nil, si, pi) then
RaiseLastOSError;
WaitForInputIdle(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
const
c : array[Boolean] of DWORD = (309, 307); // BIN, DEC
var
hWindow, hEdit : HWND;
a : array[0..9] of HWND;
b : packed array[0..99] of AnsiChar;
i : Integer;
begin
FillChar(b, 100, 0);
_RunCalc;
hWindow := FindWindow('SciCalc', nil);
hEdit := FindWindowEx(hWindow, 0, 'EDIT', nil);
for i := 0 to 9 do
a[i] := FindWindowEx(hWindow, 0, 'BUTTON', PChar(IntToStr(i)));
SendMessage(hWindow, WM_COMMAND, 304, 0);
SendMessage(hWindow, WM_COMMAND, c[bDec2Bin], 0);
for i := 1 to Length(s) do
begin
SendMessage(a[Ord(s[i]) - $30], WM_LBUTTONDOWN, 0, 0);
SendMessage(a[Ord(s[i]) - $30], WM_LBUTTONUP, 0, 0);
end;
SendMessage(hWindow, WM_COMMAND, c[not bDec2Bin], 0);
SendMessage(hEdit, WM_GETTEXT, 99, Integer(@b));
Result := b;
i := 0;
while i < Length(Result) do
begin
Inc(i);
if not (Result[i] in ['0'..'9']) then
SetLength(Result, i - 1);
end;
SendMessage(hWindow, WM_CLOSE, 0, 0)
end;
function Int2Bin(n : Integer) : string;
begin
Result := CoolConvert(IntToStr(n), True);
end;
function Bin2Int(s : string) : Integer;
begin
Result := StrToInt(CoolConvert(s, False));
end;
// Пример использования
procedure TForm1.Button1Click(Sender : TObject);
begin
ShowMessage(Int2Bin(10));
ShowMessage(IntToStr(Bin2Int('010101010101')));
end;
default (2006-09-01 22:45:00) [9]или так (теперь можно передавать строку без дополнения ведущими нулями)
function BinToByte(s: string): byte;
var
i, len: byte;
begin
Result := 0;
len := Length(s);
for i := 1 to len do
if s[i] = '1' then Result := Result or (1 shl (len-i));
end;
default (2006-09-01 22:21:00) [10]
function BinToByte(s: string): byte;
var
i: byte;
begin
Result := 0;
for i := 1 to 8 do
if s[i] = '1' then Result := Result or (1 shl (8-i));
end;
например, так
Zeqfreed (2006-09-01 21:34:00) [11]> [18] Beginer2 (01.09.06 21:33)
Опять код выпрашиваешь?
Beginer2 (2006-09-01 21:33:00) [12]Так а все таки, как с обратным процессом? Двоичное число перевести в десятичное? То есть полный процесс: сначала например 65 в 1010010, а потом полученное опять в 65 ???
Sam Stone (2006-09-01 21:15:00) [13]
> TUser © (01.09.06 20:59) [15]
random( 2) :)
Anatoly Podgoretsky (2006-09-01 21:04:00) [14]real © (01.09.06 20:35) [14]
Конечно нет, но и DEC это не двоичное, а десятичное.
TUser (2006-09-01 20:59:00) [15]
> Например имеем байт ASCII с кодом 65, нужно получить его
> в виде: 01001101 (двоичный код приведен от балды).
Ну, это легко
type
string8 = string[8];
function GetGood (Value: char): string8;
var i: integer;
begin
Randomize;
SetLength (result, 8);
for i:=1 to 8 do
result [i] := inttostr(random(1));
end;
real (2006-09-01 20:35:00) [16]
> Есть, только имя другое IntToStr
И как это поможет строковое "10011011" перевести в десятичное число?
begin...end (2006-09-01 20:10:00) [17]> DevilDevil © (01.09.06 19:45) [8]
> Я бы даже сказал, так покрасивее будет:
> ...
> If BOOL(b and (1 shl i)) Then ...
А вот так будет ещё красивее:
if Odd(b shr i) then ...
:o)
> Sam Stone © (01.09.06 20:01) [10]
HexToBin не имеет отношения к преобразованию в строковое двоичное представление.
Anatoly Podgoretsky (2006-09-01 20:05:00) [18]Beginer2 (01.09.06 20:03) [11]
Есть, только имя другое IntToStr
Beginer2 (2006-09-01 20:03:00) [19]Ну вот, я ж говорил есть наверняка стандартные средства :) Вот почему нет BinToDec? :^)
Sam Stone (2006-09-01 20:01:00) [20]Эхх, изобретатели... если нужна готовая функция, так зачем изобретать велосипед? IntToHex() + HexToBin() :))))
> А как сделать обратное преобразование?
А вот тут точно только ручками ) Спроси у яндекса.