Pliki binarne, wydobywanie informacji bajt po bajcie.
Ostatnio zmodyfikowano 2014-12-31 15:37
Boriano Temat założony przez niniejszego użytkownika |
Pliki binarne, wydobywanie informacji bajt po bajcie. » 2014-12-31 00:01:47 Witam! Mam do zrobienia program symulujący protokół 1-wire. Muszę oddzielnie stworzyć plik binarny, w którym są podane informacje o komunikacji następująco : 1 bajt (n) mówiący o liczbie bajtów wysłanych przez urządzenie master a następnie n bajtów opisujących tą komunikacje. Mój problem polega na tym, że nie bardzo wiem jak mogę wydobyć tą informację o bajtach a później wykorzystać ją do wydobycia odpowiedniej liczby bitów. Do tej pory udało mi się zrobić coś takiego. Będę wdzięczny za wszelką pomoc!
#include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <bitset> #include <cstdint>
using namespace std;
void read_rom( ifstream & plik ); void match_rom( ifstream & plik ); void skip_rom( ifstream & plik ); void search_rom( ifstream & plik );
int main() { char nazwapliku[ 80 ]; int k; ifstream plik; cin >> nazwapliku; plik.open( nazwapliku, ios::in | ios::binary ); if( !plik ) { cout << "Nieudane otwarcie pliku " << nazwapliku << endl; system( "pause" ); } while( !plik.eof() ) { plik.read( reinterpret_cast < char *>( & k ), sizeof( k ) ); if( k == 51 ) { uint8_t a; plik.read( reinterpret_cast < char *>( & a ), sizeof( a ) ); if( int( a ) == 8 ) { bitset < 64 > foo; plik.read( reinterpret_cast < char *>( & foo ), sizeof( foo ) ); cout << "Podlaczone jest jedno urzadzenie " << endl; cout << "Numer tego urzadzenia to " << endl << foo << endl; } else cout << "Nie jest podlaczone zadane urzadzenie" << endl; } else if( k == 85 ) { bitset < 64 > foo; plik.read( reinterpret_cast < char *>( & foo ), sizeof( foo ) ); cout << "Master zarzadal polaczenia z urzazeniem slave o numerze " << endl << foo << endl << endl; } cout << "Koniec danych w pliku!" << endl; system( "pause" ); return 0; }
|
|
1aam2am1 |
» 2014-12-31 00:06:08 plik.read( reinterpret_cast < char *>( & k ), sizeof( k ) ); //tu masz błąd
reinterpret_cast - najlepiej nie używać jeżeli nie musisz static_cast wystarczy
sizeof( k ) - chciałeś chyba wczytać 1 bajt a wczytujesz sizeof(int) bajtów
Najlepiej zamień int k; na char k; |
|
Boriano Temat założony przez niniejszego użytkownika |
» 2014-12-31 15:37:51 No ja właśnie próbowałem to robić na charach ale nie bardzo to wychodzi bo zapisuje sobie w oddzielnym programie liczbę 51 w dwójkowym czyli 00110011 i jak później w tym głównym programie chce to jakoś w ifie porównać to nie wychodzi tak jak powinno. Chyba, że coś źle zapisuje do pliku, już sam nie wiem. |
|
« 1 » |