Форум: "Начинающим";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];
ВнизЕсть функция IntToBin как разложить строку на биты Найти похожие ветки
← →
samsung (2010-11-12 22:19) [0]Доброго всем времени суток!!!
Есть функция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;
Результат выводится в поле Memo1procedure 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-й бит).
Спасибо!!!!
← →
Сергей М. © (2010-11-12 22:31) [1]В строке нет никаких "битов" - там есть просто некие символы, неважно какие. Для работы с данными строковых типов есть куча ф-ций - Pos[Ex], Copy, Delete e.t.c
Посему IntToBin ко всему этому имеет никакое отношение.
← →
samsung (2010-11-12 22:45) [2]Хорошо! А все же как реализовать т.е. если в строке будет найдено сочитание 111110 удалить 0 при этом сдвиг битов должен быть в лево. Объясните желательно в коде. Спасибо!!!!!!!
← →
И. Павел © (2010-11-12 23:00) [3]Вот вам подсказка:
http://delphi.scps.ru/string/str5131.htm
← →
Сергей М. © (2010-11-12 23:04) [4]
> сдвиг битов должен быть в лево
Опять двадцать пять)
Ну нет в строке никаких битов !
Символы там, а не биты)
Но уж если хочется изврата, то
s := StringReplace(s, "111110", "11111", []);
if Length(s) < 32 then s := s + "0";
← →
DVM © (2010-11-13 00:22) [5]
> samsung (12.11.10 22:45) [2]
В строке есть конечно байты, которые можно разложить на биты и даже можно найти байты в которых определенные биты установлены в нужных позициях и потом даже можно как угодно все это дело поменять. Но точно тебе это нужно?
Ведь от таких манипуляций может строка превратиться в невесть что, символы станут непечатаемыми и т.д.
Если это какое то задание, приведи его точный текст.
← →
Германн © (2010-11-13 00:30) [6]
> Если это какое то задание, приведи его точный текст.
>
http://forum.sources.ru/index.php?showtopic=317252&view=showall
← →
DVM © (2010-11-13 00:53) [7]
> Германн ©
интересно что за сказочный девайс ему шлет данные в ком-порт в таком виде.
Т.е каждый байт превращается в 8 (в лучшем случае, а с пробелом и в 9), а то и в 16 для Unicode.
← →
Германн © (2010-11-13 01:24) [8]
> интересно что за сказочный девайс ему шлет данные в ком-
> порт в таком виде
Не признается, зараза :)
Хотя "дурных самопальных" протоколов встречается не мало.
← →
Slym © (2010-11-13 07:08) [9]Германн © (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 08:46) [10]> интересно что за сказочный девайс ему шлет данные в ком-
> порт в таком виде.
ИМХО, это учебная задача.
По крайней мере, стоит на это надеяться :)
← →
Anatoly Podgoretsky © (2010-11-13 09:10) [11]У учебных задач как правило нет практического смысла, только учебный, поэтому они кажутся дурными.
← →
Dennis I. Komarov © (2010-11-13 09:25) [12]"Зина, в печку ее". Никакой IntToBin вообще не впился...
Вы когда два числа складываете тоже сперва их в строку, а потом столбиком?
← →
Dennis I. Komarov © (2010-11-13 09:37) [13]
> Сергей М. © (12.11.10 23:04) [4]
Ты биты вправо сдвинул, а говорят надо влево... :)
← →
Sha © (2010-11-13 10:07) [14]> samsung (12.11.10 22:19)
Если это не учебное задание, то использование чего-то вроде IntToBin
скорее всего свидетельствует об ошибке в проектировании.
← →
icWasya © (2010-11-13 10:51) [15]О том как не надо задавать вопросы
http://www.gunsmoker.ru/2008/10/x-y-z.html
← →
han_malign (2010-11-13 12:58) [16]
> ИМХО, это учебная задача.
- это классическое бит-кадрирование протокола 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.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c