Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.043 c
2-1157483491
Серый
2006-09-05 23:11
2006.09.24
Базы данных


4-1147959433
Nostradamus
2006-05-18 17:37
2006.09.24
Странная проблема с Хуком


1-1155644817
DelphiLexx
2006-08-15 16:26
2006.09.24
Копировать и вставить несколько контролов


15-1157317488
ramzes2
2006-09-04 01:04
2006.09.24
как назначить родителя диалогу


15-1157186344
Vlad
2006-09-02 12:39
2006.09.24
Wi-Fi точки доступа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский