Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Представить байт в двоичном виде   Найти похожие ветки 

 
Beginer2   (2006-09-01 18:32) [0]

Какой функцией можно получить байт в двоичном представлении? Например имеем байт ASCII с кодом 65, нужно получить его в виде: 01001101 (двоичный код приведен от балды). Необязательно (а скорее даже желательно) сделать не на делфи, а на TP7


 
Sam Stone ©   (2006-09-01 19:06) [1]

Цикл, and и shl спасут отца русской демократии


 
Beginer2   (2006-09-01 19:09) [2]

Что, нет готовой функции? С трудом верится. Но даже если и нет - есть формула перевода чисел из одной системы в другую?... только вот я не знаю этой формулы


 
Fay ©   (2006-09-01 19:12) [3]

2 Beginer2
1) См. [1]
2) Используй мозги - многим помогает.


 
Степан   (2006-09-01 19:14) [4]

Ну а если мозг совсем "нехачу работать", то можно вот так сделать!

function ByteToBin(Value: Byte): String;
var
 I, TempVal: Byte;
begin
 Result := "";
 for I := 0 to 7 do begin
   TempVal := Value;
   TempVal := TempVal shl I;
   TempVal := TempVal shr 7;
   Result := Result + IntToStr(TempVal);
 end;
end;


 
Palladin ©   (2006-09-01 19:15) [5]

нет формулы, есть алгоритм


> только вот я не знаю этой формулы

не расстраивайся, вот ссылочка... пробелы лишние только удали...

http://www.google.ru/search?hl=ru&q=%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC+%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B0+%D0%B2+%D0%B4%D1%80%D1%83%D0%B3%D1%83%D1%8E+%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%83+%D0%B8%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=


> Что, нет готовой функции?

не расстраивайся, только не реви

Function ByteToBin(b:Byte):String;
Var
i:Integer;
Begin
SetLength(Result,8);
For i:=0 to 7 Do
 If (b and (1 shl i))=(1 shl i) Then Result[8-i]:="1" Else Result[8-i]:="0";
End;


 
Zeqfreed ©   (2006-09-01 19:25) [6]

function ByteToBinaryStr(b : Byte) : ShortString;

function GetBitAndShift() : Char;
const
 ConvTbl : array[0..1] of Char = ("0", "1");
begin
 Result := ConvTbl[Byte(b and 1)];
 b := b shr 1;
end;

var
 i : Integer;
begin
 Result := "00000000";
 i := 8;
 repeat
  Result[i] := GetBitAndShift();
  Dec(i);
 until (b = 0) or (i = 0);
end;


 
Beginer2   (2006-09-01 19:34) [7]


> не расстраивайся, только не реви
>
> Function ByteToBin(b:Byte):String;
> Var
> i:Integer;
> Begin
> SetLength(Result,8);
> For i:=0 to 7 Do
>  If (b and (1 shl i))=(1 shl i) Then Result[8-i]:="1" Else
> Result[8-i]:="0";
> End;


Спасибо, работает. Честно говоря был уверен что есть готовая функция.


 
DevilDevil ©   (2006-09-01 19:45) [8]

> Palladin ©   (01.09.06 19:15) [5]

Я бы даже сказал, так покрасивее будет:

Function ByteToBin(b:Byte):String;
Var
i:Integer;
Begin
SetLength(Result,8);
For i:=0 to 7 Do
If BOOL(b and (1 shl i)) Then Result[8-i]:="1" Else Result[8-i]:="0";
End;


Ну в крайнем случае с нулём сравнить


 
Beginer2   (2006-09-01 19:45) [9]

Можно еще один тупой вопрос на эту тему? А как сделать обратное преобразование? :)


 
Sam Stone ©   (2006-09-01 20:01) [10]

Эхх, изобретатели... если нужна готовая функция, так зачем изобретать велосипед? IntToHex() + HexToBin()  :))))

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

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


 
Beginer2   (2006-09-01 20:03) [11]

Ну вот, я ж говорил есть наверняка стандартные средства :) Вот почему нет BinToDec? :^)


 
Anatoly Podgoretsky ©   (2006-09-01 20:05) [12]

Beginer2   (01.09.06 20:03) [11]
Есть, только имя другое IntToStr


 
begin...end ©   (2006-09-01 20:10) [13]

> 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 не имеет отношения к преобразованию в строковое двоичное представление.


 
real ©   (2006-09-01 20:35) [14]


> Есть, только имя другое IntToStr

И как это поможет строковое "10011011" перевести в десятичное число?


 
TUser ©   (2006-09-01 20:59) [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;


 
Anatoly Podgoretsky ©   (2006-09-01 21:04) [16]

real ©   (01.09.06 20:35) [14]
Конечно нет, но и DEC это не двоичное, а десятичное.


 
Sam Stone ©   (2006-09-01 21:15) [17]


> TUser ©   (01.09.06 20:59) [15]

random(2) :)


 
Beginer2   (2006-09-01 21:33) [18]

Так а все таки, как с обратным процессом? Двоичное число перевести в десятичное? То есть полный процесс: сначала например 65 в 1010010, а потом полученное опять в 65 ???


 
Zeqfreed ©   (2006-09-01 21:34) [19]

> [18] Beginer2   (01.09.06 21:33)

Опять код выпрашиваешь?


 
default ©   (2006-09-01 22:21) [20]


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;


например, так


 
default ©   (2006-09-01 22:45) [21]

или так (теперь можно передавать строку без дополнения ведущими нулями)

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;


 
Fay ©   (2006-09-02 01:39) [22]

Слобал 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-02 08:30) [23]

Fay ©   (02.09.06 01:39) [22]
забавно!
код инженерного вида и переключателей Dec, Bin ещё подсмотрел:)

осталось только ещё подсоединиться к удалённому серверу где-нибудь на краешке земли и попросить его выполнить требуемые сверхинтеллектуальные операции перевода, алгоритмы которых строго засекречены


 
DprYg ©   (2006-09-02 09:16) [24]


> Beginer2
Весь код пишется элементарно, если знать системы
счисления. Советую изучить. Без них - никуда.


 
Fay ©   (2006-09-02 15:27) [25]

2 default ©   (02.09.06 8:30) [23]
> код инженерного вида и переключателей Dec, Bin ещё подсмотрел:)

Просто взял из ресурсов. Как и класс окна 8)


 
Eraser ©   (2006-09-02 15:44) [26]

> [7] Beginer2   (01.09.06 19:34)


> Честно говоря был уверен что есть готовая функция.

IntToBin из IdGlobalProtocols или
IntToHex, HexToBin.

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

BinToHex, StrToInt.


 
begin...end ©   (2006-09-02 17:47) [27]

> Eraser ©   (02.09.06 15:44) [26]

См. [13]. HexToBin/BinToHex не предназначены для преобразования в строковое двоичное представление (или из него). Они преобразуют строку, содержащую шестнадцатеричное представление некоторой последовательности байт, в набор байт, соответствующий этому представлению (и наоборот).


 
Anatoly Podgoretsky ©   (2006-09-02 18:12) [28]

Потому что понятие BIN расплывчатое, это может быть и двоичное представление, но чаще внутреннее - любые двоичные данные.


 
Desdechado ©   (2006-09-02 18:49) [29]

следующий вопрос будет про слово или двойное слово
и про порядок байтов в нем



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.031 c
15-1157515336
DeStranger
2006-09-06 08:02
2006.09.24
TheBat!


1-1155282476
Zilog_
2006-08-11 11:47
2006.09.24
Ребята помогите разобраться с переводом с С++ в Делфи


5-1139847378
TVV
2006-02-13 19:16
2006.09.24
Использование компонент из DLL


1-1155585410
Franzy
2006-08-14 23:56
2006.09.24
Проблема с Exception


1-1155628054
трям
2006-08-15 11:47
2006.09.24
Как определить Rect выделенной ячейки в DBGrid ?