WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

einzelne Bits in Dateien bearbeiten

 

Thomas_74
Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 06.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2014, 09:41     Titel: einzelne Bits in Dateien bearbeiten
  Antworten mit Zitat      
Hi,

ich möchte einzelne Bits in Dateien bearbeiten.
Dazu möchte ich eine Datei einlesen (was glaub ich auch funktioniert).
Code:
fid = fopen('Beispiel.zip','rb');
Arch = fread(fid,'uint8');
Arch = dec2bin(Arch);
Arch = reshape(Arch,[],1);
Arch = uint8(Arch);
Arch = logical(Arch);
fclose(fid);


Allerdings gelinkt mir das zurückschreiben nicht. Ich habe es Probehalber mal ohne jegliche bearbeitung der Daten versucht.

Code:
fid = fopen('Kontrolle.zip', 'wb');
Arch = reshape(Arch,[],8);
Arch = bin2dec(num2str(Arch));
fwrite(fid, Arch,'uint8');
fclose(fid);


Kann mir jemand bitte sagen wo ich meine Fehler eingebaut habe? Ich sollte doch eine Datei einlesen können die Bytes in Bits wandeln und das ganze dann auch wieder Rückwärts?

MfG Thomas
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.01.2014, 01:29     Titel: Re: einzelne Bits in Dateien bearbeiten
  Antworten mit Zitat      
Hallo Thomas_74,

Wie wäre es, wenn Du die Daten direkt als UINT8 Vektor bearbeitest? Mit BITSET lässt sich das gut machen, oder? Statt des 43.ten Bits setzt Du halt das REM(43,8), also 3.te Bit des FLOOR(43/8) Bytes.

Zitat:
Allerdings gelinkt mir das zurückschreiben nicht.

Bitte erkläre immer, was genau nicht funktioniert. Es ist leichter ein Problem zu lösen, wenn man es nicht zuerst erraten muss.

Der Umweg über Strings ist bei DEC2BIN und BIN2DEC umständlich. Direkter geht es mit Zahlen-Arithmetik:
Code:
x = fread(fid, 'uint8');
b = rem(floor(pow2(-7:0).' * x), 2);
y = pow2(7:-1:0) * b;

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas_74
Themenstarter

Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 06.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2014, 13:42     Titel:
  Antworten mit Zitat      
Hi,

hab es jetzt mit Öffnen:
Code:
function ausg=openbit(xname)

fid = fopen(xname,'rb');
ausg = fread(fid,'uint8');
ausg = dec2bin(ausg);
ausg = reshape(ausg,[],1);
fclose(fid);


und Schreiben:
Code:
function schrbit(Data,xname)

Data=reshape(Data,[],8);
Data=bin2dec(num2str(Data));

fid = fopen(xname, 'wb');
fwrite(fid, Data, 'uint8');
fclose(fid);


gemacht.
Wenn es da aber was schnelleres gibt würde ich natürlich sofort umstellen.
Bei dem Code von Jan S
Code:
function ausg=openbit2(xname)

fid = fopen(xname,'rb');
x = fread(fid, 'uint8');
ausg = rem(floor(pow2(-7:0).' * x), 2);
fclose(fid);


kam bei mir die Fehlermeldung:

??? Error using ==> mtimes
Inner matrix dimensions must agree.

Error in ==> openbit2 at 6
ausg = rem(floor(pow2(-7:0).' * x), 2);

Error in ==> eaufruf1 at 27
Arch2=openbit2('Archiv.bin');

MfG Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.01.2014, 14:11     Titel:
  Antworten mit Zitat      
Hallo

da hat Jan einen Tippfehler, sollte in der Zeile wohl so heißen:
Code:


ausg = rem(floor(pow2(-7:0)' .* x), 2);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas_74
Themenstarter

Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 06.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2014, 15:11     Titel:
  Antworten mit Zitat      
Hmm noch immer nicht so ganz.
Bei:
Code:
function ausg=openbit2(xname)

fid = fopen(xname,'rb');

x = fread(fid, 'uint8');
ausg = rem(floor(pow2(-7:0)' .* x), 2);
fclose(fid);



kommt jetzt:

Zitat:
??? Error using ==> times
Matrix dimensions must agree.

Error in ==> openbit2 at 6
ausg = rem(floor(pow2(-7:0)' .* x), 2);



MfG Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas_74
Themenstarter

Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 06.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2014, 13:54     Titel:
  Antworten mit Zitat      
Hi,

mein MATLAB 2009a liefert bei
Code:
x = fread(fid, 'uint8');

double Werte.
und
Code:

führt zu der Fehlermeldung:
Zitat:
??? Error using ==> times
Matrix dimensions must agree.


ist das ein Bug oder ein Programmierfehler?

MfG Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.01.2014, 01:45     Titel:
  Antworten mit Zitat      
Hallo Thomas_74,

Vorschlag:
Code:
function ausg=openbit2(xname)
fid = fopen(xname,'rb');
x = fread(fid, 'uint8');
ausg = rem(floor(pow2(-7:0).' * x.'), 2);
fclose(fid);

Es fehlte das Transponieren bei x. Ich kann mir nicht merken, of FREAD einen Zeilen- oder Spaltenvektor zurückliefert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas_74
Themenstarter

Forum-Century

Forum-Century


Beiträge: 241
Anmeldedatum: 06.02.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2014, 14:42     Titel:
  Antworten mit Zitat      
THX

jetzt läufts!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.