Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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;


Результат выводится в поле 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.003 c
15-1286972348
vv_fran
2010-10-13 16:19
2011.01.30
Как перекодировать русский текст формы в Win1251 ?


2-1289575914
faiwer
2010-11-12 18:31
2011.01.30
Windows 7


15-1287146463
Petr V. Abramov
2010-10-15 16:41
2011.01.30
контекстная реклама жжет :)


15-1286732325
Сергей
2010-10-10 21:38
2011.01.30
Литература для начинающих


15-1287098390
Германн
2010-10-15 03:19
2011.01.30
Шаблон для оператора case





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский