Autor Beitrag
huhn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Sa 26.03.05 13:28 
Hi leute hab folgendes problem:
ich lad eine datei in ein stream und kopiere sie dann zu file of tbits,soweit so gut
nun möchte ich aber auf die einzelnen bits von file of tbits zugreifen und ändern können wie mach ich das??? hab schon einiges gelesen aber des richtige hab ich noch nicht gefunden.
Ich hab des read und write benützt,aber weiß net genau was es hier macht,denn bei der kontrolle kam nix gescheites heraus(immer ne accessviolation meldung);
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
procedure TForm1.Button1Click(Sender: TObject);
var f:file of tbits;
    laenge,stelle,z:integer;
    b2:tbits;
    s1,s2:tfilestream;
begin
stelle:=0;
if od.Execute and sd.Execute then
  begin
    try
      s1:=Tfilestream.Create(sd.FileName,fmcreate);    //copy file! 1 zu 1!!
      s2:=Tfilestream.Create(od.FileName,fmOpenRead);   //und machmit kopierten file weiter!!*G*
      s1.CopyFrom(s2,s2.Size);
    finally
      s1.Free;
      s2.Free;
    end;

    assignfile(f,sd.FileName); //start reading,writing!
    reset(f);
    laenge:=filesize(f);        //Dateigröße,brauchich eigentlich nicht
    b2:=tbits.Create;
      read(f,b2);               //einfach mal zum testen lesen und gleich wieder drüber-
      write(f,b2);              //schreiben
      closefile(f);
      {for laenge:=0 to b2.Size-1 do          //sollte ne kontrolle werden
        begin                            // obs funktioniert hat
          if b2.Bits[laenge]=true then listbox1.Items.add('1')
          else listbox1.Items.add('0');
        end;}

      b2.Free;
      showmessage('Fertig! Habe '+inttostr(laenge*8)+' Bits geschrieben!');//ob des 
  end;                                                                      //stimmt?
end;

dank euch schon mal im vorraus*g*
mfg huhn

p.s.:hab sicher wieder jede menge müll geschrieben (rechtschreibfehler,grammatik etc),nehmt mirs bitte net übel :wink:


Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am So 27.03.2005 um 21:57
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Sa 26.03.05 20:02 
guck dir mal den auskommentierten quelltext an, dort ist schon die lösung: b2.Bits[<<einIndex>>]

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Sa 26.03.05 20:33 
ja des weiß ich auch aber wie ist des mit dem file of tbits, dort geht das nicht.
wird da f zu b2 kopiert??ich glaube nicht den bei mir war des immer leer.
mfg huhn
PS:*g* heiße au patrick

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: So 27.03.05 12:11 
mal ne andere frage, du möchtest eigendlich nur eine Datei kopieren richtig?
warum machst du es dir überhaupt so kompliziert?
hiermit erzielst du das selbe ergebnis:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Tform1.CopyFile( source, destination:string);
var DataFile:TMemoryStream;
begin
  DataFile:=TMemoryStream.Create;
  DataFile.LoadFromFile(source);
  DataFile.SaveToFile(destination);
  DataFile.Free;
end;


ich habe mir den quelltext gerade mal genauer (bzw das erste mal wirklich) angeschaut und muss feststellen: der code ist ja total wirr :shock:
die zeilen 10 bis 17 machen doch schon die ganze arbeit, wozu ist dann der ganze untere code noch nötig?. allerdings solltest du meine oben genannte variante nehmen, da die nur halb so viel arbeitsspeicher braucht und schneller ist ^^

in zeile 19 öffnest du jetzt die datei die du gerade kopiert hast (WARUM?)
außerdem verwendest du die variable laenge 2x (ok das zweite im kommentierten quelltext -aber sowas ist immer schlecht, auch wenn sich das hier nicht auswirkt)

dein hauptproblem ist aber, das die funktion "read" nicht so funktioniert wie du dir ds gedacht hast. les dir mal die hilfe zu "read" durch, dort steht, welche typen man mit "read" lesen kann.
Delphi Online Hilfe hat folgendes geschrieben:

Read reads data from a file.

Unit

System

Category

text file routines

Typed files:

procedure Read(F , V1 [, V2,...,Vn ] );

Text files:

procedure Read( [ var F: Text; ] V1 [, V2,...,Vn ] );

Description

The Read procedure can be used in the following ways.

For typed files, it reads a file component into a variable.
For text files, it reads one or more values into one or more variables.

With a type string variable:

Read reads all characters up to, but not including, the next end-of-line marker or until Eof(F) becomes True; it does not skip to the next line after reading. If the resulting string is longer than the maximum length of the string variable, it is truncated.
After the first Read, each subsequent Read sees the end-of-line marker and returns a zero-length string.
Use multiple Readln calls to read successive string values.

When the extended syntax is enabled, Read can read null-terminated strings into zero-based character arrays.

With a type character variable:

Read reads one character from the file and assigns it to the variable. IfCRLF mode is enabled and Eof(F) was True before Read was executed, the value Chr(26) (a Ctrl-Z character) is assigned to the variable. (To enable CRLF mode, use SetLineBreakStyle.)

With type integer or type real variables:

Read skips any blanks, tabs, or end-of-line markers preceding the numeric string.
If the numeric string does not conform to the expected format, an I/O error occurs; otherwise, the value is assigned to the variable.
The next Read starts with the blank, tab, or end-of-line marker that terminated the numeric string.


b2ist also immer 0.

wie man das auf deinen weg realisieren kann, hab ich leider keine ahnung, allerdings würde es vielleicht helfen zu wissen was du eigendlich vor hast. bzw was das ziel der prozedur ist :D

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: So 27.03.05 12:59 
@Patrick: thx erstmal(au für den guten tipp mit dem tmemorystream),also ich wollt erst die datei kopieren und dann mit der kopierten datei weitermachen,dh dass ich bei dieser jedes bit ändern kann.des mit dem read und write sollte en test sein obs mit dem klappt,hats auch(bei normalen txt dateien aber nicht bei doc(kam nur müll zum teil raus) zb).
tja mmmh weiß jemand wie ich ne datei direkt in ein tbit laden kann,oder muss ich den umständlichen weg über bytes gehen?
mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: So 27.03.05 18:02 
du kannst die daten sehr schön auch direkt im stream auslesen, manipulieren und schreiben.
TStream ist ein sehr mächtiges objekt, und bietet fast unendlich viele manipulationsmöglichkeiten.

sehr empfehlen kann ich dir dieses tutorial:
www.delphi-total.de/tutorials/streams/

außerdem kannst du dir mal die klasse TStream und TCustomMemoryStream in der Delphi-Hilfe anschaun und dich mal durch die methoden arbeiten.
für weitere fragen ist dann natürlich das DF für dich da :D

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Mo 28.03.05 13:23 
@patrick: danke! :D
ok habs mir mal angeguckt, ich versuche es mal:
-ich kopiere meine datei
-dann lade ich sie in ein stream
-vom stream aus kann ich die bytes lesen und schreiben
-wenn ich auf die bytes zugreifen kann, kann ich auch bits verändern
-dann kann ich es wieder bequem ins stream schreiben
-und dann speichern

ist zwar en bissle umständlich geht aber wahrscheinlich nicht anders.
meinst du des könnte funktionier(so grob)?
mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Mo 28.03.05 17:49 
du machst es dir aber umständlich ^^
du kannst die datei in einen stream laden,
dort sofort verändern (der inhalt ist dann im stream und die datei kann dann nicht mehr geändert werden wenn du die datei mit per EinFileStream.Create( <<Dateiname>>,fmOpenRead) erstellst)
und dann die geänderte datei abspeichern

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Di 29.03.05 10:30 
Also hab des mal umgesetzt(ich denk mal so oder?) :) :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
var DataFile:TMemoryStream;
    data:TfileStream;
    bytes:array of byte;
begin
if od.Execute and sd.Execute then
  begin
    try
      DataFile:=TMemoryStream.Create;
      DataFile.LoadFromFile(od.filename);

      data:=Tfilestream.Create(sd.FileName,fmcreate);
      data.CopyFrom(datafile,datafile.Size);

      setlength(bytes,300);
      data.Seek(0,soFromBeginning  );
      data.read(bytes,255);
      showmessage(inttostr(data.Position));
      data.Seek(0,soFromBeginning  );
      data.Write(bytes,253);
    finally
      data.free;
      DataFile.Free;
    end;
  end;
end;

hier kommt jedoch immer ne EAccessViolation meldung(kein plan warum).
mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Di 29.03.05 13:41 
Nach einigen probieren hab ich es so hinbekommen!
Kann mir einer erklären warum des funktioniert aber nich so wie ich es zuvor gemacht habe?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure tform1.reading(s:Tstream;var b:array of byte;count:integer);
begin
  s.readbuffer(b,count);
end;

procedure tform1.writing(s:Tstream;b:array of byte;count:integer);
begin
  s.WriteBuffer(b,count);
end;

procedure TForm1.Button11Click(Sender: TObject);
var bytes:array of byte;
    s:Tstream;
begin
if od.Execute then
  begin
    try
      s:=TFileStream.Create(od.FileName,fmopenreadwrite);
      showmessage(inttostr(s.Size));
      setlength(bytes,350);
      s.Seek(0,soFromBeginning  );
      reading(s,bytes,349);
      s.Seek(0,soFromBeginning  );
      writing(s,bytes,349);
    finally
      s.free;
    end;
  end;
end;

mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Do 31.03.05 16:31 
ok hab en bissle rumexpirementiert,und des is herausgekommen:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure TForm1.Button7Click(Sender: TObject);
var s:Tstream;
    key,buffer:array of byte;
    lauf,size,x,grose:integer;
begin
if Passwortedit.Text='' then      //eingabefeld überprüfen!!
  begin
    showmessage('Passwort wählen!');
    exit;
  end;
if od.Execute then
  begin
  try
  S:= TFileStream.Create(od.FileName, fmopenreadwrite); //file öffnen
  //algo rhytmus!
  setlength(key,sizeof(passwortedit.Text));  //strtobyte konvertieren
  strtobyte(passwortedit.Text,key);
  size:=sizeof(key);       
  //crypt!
  setlength(buffer,s.size);
  s.seek(0,sofrombeginning);
  grose:=s.size;
    reading(s,buffer,s.size);      //lesen
    s.Seek(0,sofrombeginning);
    x:=0;
    for lauf:=0 to s.size do       //erster durchgang!!crypten mit xor
      begin
        buffer[lauf]:=key[x] xor buffer[lauf];  //sizeof(buffer)=size
        if x=sizeof(key) then x:=0
        else x:=x+1;
      end;
    x:=sizeof(key);
    for lauf:=0 to s.size do       //zweiter Durchgang!crypten mit xor
      begin
        buffer[lauf]:=key[x] xor buffer[lauf];  //sizeof(buffer)=size
        if x=0 then x:=sizeof(key)
        else x:=x-1;
      end;
    writing(s,buffer,s.size);      //schreiben
  s.seek(0,sofrombeginning);
  showmessage('Fertig! Es wurden '+inttostr(grose)+' Bytes gecryptet und geschrieben!');
  finally
    s.free;
  end;
  end;
end;

des funktioniert auch gut, doch wenn ich das programm schließe mit close kommt immer ne fehlermeldung:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
---------------------------
Anwendungsfehler
---------------------------
Exception EAccessViolation in Modul Project1.exe bei 6547F000.

Zugriffsverletzung bei Adresse 65480000. Lesen von Adresse 65480000.
---------------------------
OK   
---------------------------

was ist da kaputt?
mfg huhn

//edit:Wenn key klein ist kommt keine fehlermeldung!

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Do 31.03.05 16:50 
es liegt glaub ich irgendwie an der prozedure: :(
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure tform1.strtobyte(instring:string;var outbytes:array of byte);
var i:integer;
    c:array of char;
begin
setlength(c,length(instring));
  for i:=1 to length(instring) do
    begin
      c[i-1]:=instring[i];
    end;
  for i := 0 to length(c) do
    outbytes[i] := ord(c[i]);
end;

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Do 31.03.05 17:13 
mensch seid ihr hilfsbereit naja hab was anderes auf ner japanischen oder chinesischen seite gefunden:
www.delphibbs.com/de...dispq.asp?lid=616574(für alle dies interessiert)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Procedure StrToByteS(const Str:String;var NameArr :Array of byte);
var I,J :Integer;
Begin
  FillChar(NameArr,high(NameArr)+1,0);
  if length(Str) >high(NameArr) then J :=high(NameArr)
  else J :=length(Str);
  For I:=1 to J do NameArr[I-1]:=byte(Str[I]);
End;

Function ByteToStr (NameArr :Array of byte):String;
var I:Integer;
    S:String;
Begin
 Setlength(S,High(NameArr)+1);
 For I:=Low(NameArr) to High(NameArr) do S[I+1]:=Char(NameArr[I]);
 Result :=Pchar(S);
End;

ich hab mal den code dür alle nach mir gepostet!
mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Do 31.03.05 20:54 
du hast ja auch innerhalb von ner halben stunde, 3 versionen geschrieben, normalerweise muss man in nem forum meist tage waren bis man ne antwort bekommt.
ist dein problem jetzt überhauot gelöst?
ich bin ab morgen mittag fürs wochenende nicht mehr erreichbar, ich werd deine fragen also nicht beantworten können :mrgreen:

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
huhn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 272
Erhaltene Danke: 1

WIN XP
D7Pers
BeitragVerfasst: Sa 02.04.05 15:49 
JO great thx :D
mein Problem ist soweit gelöst(war so schnell,weil ich gerade ferien habe :wink: )
also dann noch mal danke!
Des ding funktioniert soweit(werte jetzt mehrere verschlüsselungsverfahren im angriff nehmen(z.b OTP AES etc))
mfg huhn

_________________
Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*