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

Вниз

Есть функция 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;


Результат выводится в поле 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-й бит).
Спасибо!!!!


 
Сергей М. ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.007 c
15-1286957950
Сергей М.
2010-10-13 12:19
2011.01.30
RadPHP XE: стою на асфальте я в лыжи обутый ..


15-1287403277
Дмитрий Тимохов
2010-10-18 16:01
2011.01.30
Посоветуйте стредство шифрования файлов.


15-1287572572
Сергей М.
2010-10-20 15:02
2011.01.30
TSSHClient (Synapse + SSL CryptoLib based)


15-1286772364
12
2010-10-11 08:46
2011.01.30
Посоветуйте литературу по термохххх


11-1229310616
L`Autour
2008-12-15 06:10
2011.01.30
Вопрос по перехвату LVN_GETDISPINFOW