Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Представить байт в двоичном виде [D5, D6, D7, D2005, NT4, 2000, XP, 2003]


Страницы:   1 2

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()  :))))

>  А как сделать обратное преобразование?

А вот тут точно только ручками ) Спроси у яндекса.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо