![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть функция IntToBin как разложить строку на биты [D6, XP]
samsung © (2010-11-12 22:19:00)Доброго всем времени суток!!!
Есть функция
function IntToBin(Value: integer; Digits: integer): string;
var
i: integer;
begin
result := '';
for i := 0 to Digits - 1 do begin
if Value and (1 shl i) > 0
then result := '1' + result
else result := '0' + result;
end;
end;
Результат выводится в поле Memo1
procedure TForm1.StrToMemoFile(const St: String);
var
I: Integer;
S: String;
begin
S := S + ' ' + inttoBin(Ord(St[I]),8); // Bin
memo1.Text := memo1.text + S;
end;
Как разложить строку на биты, найти 111110 и из нее удалить 0 (6-й бит).
Спасибо!!!!
han_malign (2010-11-13 12:58:00) [1]
> ИМХО, это учебная задача.
- это классическое бит-кадрирование протокола Q921, но делать его через IntToBin - это чесать левой пяткой правое ухо...
unit u7E;
{$IF CompilerVersion >= 1.5}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CODE OFF}
{$WARN UNSAFE_CAST OFF}
{$IFEND}
interface
type T7EParseResult = (prComplete,prMoreData,prIdle,prInvalidLength,prBitStaffError, prInvalidFlag);
type
T7EContext = record
bFlag,
bData : byte;
nBits : integer;
nStaff: byte;
end;
function ParseFrame(var aCntx: T7EContext; aByte: byte;
var aFrame; aFrameSize: integer; var aCollected: integer; aMask: byte= $FF): T7EParseResult;
implementation
function ParseFrame(var aCntx: T7EContext; aByte: byte;
var aFrame; aFrameSize: integer; var aCollected: integer; aMask: byte= $FF): T7EParseResult;
var _frame: array[0..1023]of byte absolute aFrame;
len: integer;
begin
Result:= prIdle;
aCollected:=aCntx.nBits shr 3;
with aCntx do if((nBits>0)or(bFlag=$7E)or((aByte and aMask)<>aMask))then begin
while(aMask<>0)do begin
if(aMask and $80<>0)then begin
if((aByte and $80)=0)then begin
bFlag:=bFlag shr 1;
if((nBits > 0)and(nBits < 7))then begin
Result:= prInvalidFlag;
nBits:= 1;
end else begin
if(nStaff<>5)then begin bData:=bData shr 1; Inc(nBits); end;
end;
nStaff:=0;
end else begin
bFlag:=(bFlag shr 1) or $80;
if(nBits>0)then begin//prevent form edge parsing pseudoerror
bData:=(bData shr 1) or $80; Inc(nBits);Inc(nStaff);
end;
end;
len:=(nBits shr 3)-1;//avoid flag
if(bFlag=$7E)then begin { Flag }
if((nBits and $07)=0)then begin
aCollected:=len-1;
if(aCollected>0)then begin
Result:=prComplete;//on 7 extra bits results not crossing
end;
end else begin
aCollected:=len;
Result:=prInvalidLength;//on 7 extra bits results not crossing
end;
if(nBits>16)then nBits := 0
else if(nBits >= 8)then nBits := 8;
end else begin
if(nStaff>6)then begin
aCollected:=len;
if(nBits <> 15)then
Result:=prBitStaffError//on 7 extra bits results not crossing
else
Result:=prIdle;
nStaff := 0; {bData := 0;} nBits := 0;
end else begin
if((nBits and $07)=0)then begin
if(len>0)then begin
if(len<=aFrameSize) then _frame[len-1] := bData;
end;
end;
end;
end;
end;
aByte:=aByte shl 1;
aMask:=aMask shl 1;
end;
if((Result = prIdle) and (nBits > 16))then Result:=prMoreData;
end else bFlag:=$FF;
end;
end.
icWasya (2010-11-13 10:51:00) [2]О том как не надо задавать вопросы
http://www.gunsmoker.ru/2008/10/x-y-z.html
Sha (2010-11-13 10:07:00) [3]> samsung (12.11.10 22:19)
Если это не учебное задание, то использование чего-то вроде IntToBin
скорее всего свидетельствует об ошибке в проектировании.
Dennis I. Komarov (2010-11-13 09:37:00) [4]
> Сергей М. © (12.11.10 23:04) [4]
Ты биты вправо сдвинул, а говорят надо влево... :)
Dennis I. Komarov (2010-11-13 09:25:00) [5]"Зина, в печку ее". Никакой IntToBin вообще не впился...
Вы когда два числа складываете тоже сперва их в строку, а потом столбиком?
Anatoly Podgoretsky (2010-11-13 09:10:00) [6]У учебных задач как правило нет практического смысла, только учебный, поэтому они кажутся дурными.
И. Павел (2010-11-13 08:46:00) [7]> интересно что за сказочный девайс ему шлет данные в ком-
> порт в таком виде.
ИМХО, это учебная задача.
По крайней мере, стоит на это надеяться :)
Slym (2010-11-13 07:08:00) [8]Германн © (13.11.10 1:24) [8]
дурных самопальных IntToBin еще больше... вот один из них
function IntToBin(Value,Digits: integer): string;
begin
SetLength(result,Digits);
while Digits>0 do
begin
result[Digits]:=chr(ord('0')+(Value and 1));
Value:=Value shr 1;
dec(Digits);
end;
end;
быстрее
в 24 раза на Digits=8
более чем в 32 раза на Digits=16
в 47 раз на Digits=32
еслиб не UniqueString в result[Digits] вставляемым D7 компилятором былобы еще быстрее
Германн (2010-11-13 01:24:00) [9]
> интересно что за сказочный девайс ему шлет данные в ком-
> порт в таком виде
Не признается, зараза :)
Хотя "дурных самопальных" протоколов встречается не мало.
DVM (2010-11-13 00:53:00) [10]
> Германн ©
интересно что за сказочный девайс ему шлет данные в ком-порт в таком виде.
Т.е каждый байт превращается в 8 (в лучшем случае, а с пробелом и в 9), а то и в 16 для Unicode.
Германн (2010-11-13 00:30:00) [11]
> Если это какое то задание, приведи его точный текст.
>
http://forum.sources.ru/index.php?showtopic=317252&view=showall
DVM (2010-11-13 00:22:00) [12]
> samsung (12.11.10 22:45) [2]
В строке есть конечно байты, которые можно разложить на биты и даже можно найти байты в которых определенные биты установлены в нужных позициях и потом даже можно как угодно все это дело поменять. Но точно тебе это нужно?
Ведь от таких манипуляций может строка превратиться в невесть что, символы станут непечатаемыми и т.д.
Если это какое то задание, приведи его точный текст.
Сергей М. (2010-11-12 23:04:00) [13]
> сдвиг битов должен быть в лево
Опять двадцать пять)
Ну нет в строке никаких битов !
Символы там, а не биты)
Но уж если хочется изврата, то
s := StringReplace(s, '111110', '11111', []);
if Length(s) < 32 then s := s + '0';
И. Павел (2010-11-12 23:00:00) [14]Вот вам подсказка:
http://delphi.scps.ru/string/str5131.htm
samsung (2010-11-12 22:45:00) [15]Хорошо! А все же как реализовать т.е. если в строке будет найдено сочитание 111110 удалить 0 при этом сдвиг битов должен быть в лево. Объясните желательно в коде. Спасибо!!!!!!!
Сергей М. (2010-11-12 22:31:00) [16]В строке нет никаких "битов" - там есть просто некие символы, неважно какие. Для работы с данными строковых типов есть куча ф-ций - Pos[Ex], Copy, Delete e.t.c
Посему IntToBin ко всему этому имеет никакое отношение.