Форум: "Начинающим";
Текущий архив: 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