Czytanie bitów z pliku

0

Dzień dobry. Jaki jest najsłuszniejszy sposób czytania pliku w postaci ciągu bitow? Każdy plik tak jest na dysku zapisany - upraszczajac - i w ten sposób chce to czytać. Poza tym standardowe metody pozwalają czytac sama zawartość pliku. Co jeśli chciałbym przeczytać wszystko, razem z exif, data modyfikacji i innymi takimi? Załóżmy, że moze działać to wstępnie tylko na *nixach.

0

Najmniejszą "jednostką alokacji" danych w C/C++ jest bajt char ale wartości poszczególnych bitów danego bajtu da się odseparować za pomocą takiego małego obejścia:

http://stackoverflow.com/questions/22390641/read-file-by-bits-c

0

No jasne, w ten sposób można czytać zawartość pliku. Ale jak przeczytać inne informacje?

1

Do "ładnej" obsługi plików, użył bym boost.filesystem albo sprawdził czy Twój kompilator nie ma już tego w <experimental/filesystem>
( http://en.cppreference.com/w/cpp/experimental/fs ). Filesystem ma być w następnym standardzie C++ :-) (zobaczymy...) W drugiej kolejności owinięcie stat/fstat z <sys/stat.h>. Co do exif'a, przychylam się do zdania kolegi że lepiej będzie biblioteką a nie odkrywać na jakim przesunięciu i strukturze wpisane są pola informacji exif.

0

Nie no, można robić cuda na kiju i czytać każdą sekcje danych oddzielnie, ale mnie to nie interesuje. Nie interesuje mnie który bajt odpowiada za jakie dane.
W pliku zapisanych jest wiele informacji poza samą jego zawartością (różnie interpretowaną). W obrazach jest exif, w mp3 jest ID3, w avi jest bitrate i inne takie. Bardzo wiele zależy od formatu, mnie to jednak nie interesuje i chciałbym wziąć plik od pierwszego bajtu, który zajmuje na dysku, do ostatniego. Czymkolwiek te bajty są.

2
pingwindyktator napisał(a):

chciałbym wziąć plik od pierwszego bajtu, który zajmuje na dysku, do ostatniego. Czymkolwiek te bajty są.

Z tego wynika, że jedyne czego potrzebujesz to std::fstream. Albo źle rozumiem.

Jeżeli chodzi o nazwę, datę powstania, modyfikowania itp to nie jest tak, że te informacje są "w pliku". Plik to plik. Ciąg bajtów. To, że ma on jakąś datę utworzenia to plik o tym nie wie. Wie o tym system plików i jak on tym zarządza, gdzie to trzyma to jego sprawa (no i systemu operacyjnego).

Najłatwiej chyba będzie pokazać to na FATcie bo jest prosty. W tym systemie plików foldery nie różnią się od zwykłych plików niczym oprócz zawartości. Plik np. tekstowy ma w sobie po prostu ciąg znaków. Folder natomiast ma ciąg tzw. Directory entries. To directory entry jest strukturą i tam są trzymane właśnie te infomacj o pliku w folderze. Nazwę, datę powstania, modyfikowania, rozmiar itd. oraz "wskaźnik" (w uproszczeniu) gdzie zawartość tego pliku (czyli np. ciąg literek w pliku tekstowym) leży fizycznie na dysku.
http://wiki.osdev.org/FAT#Directories

Sam widzisz, że to co chcesz zrobić nie jest takie proste. Metadane są odseparowane od zawartości pliku i mając samą ścieżkę do pliku nie możesz zrobić nic poza odczytaniem jego zawartości.

Opcje masz takie, żeby użyć gotowych rozwiązań. A jeżeli na prawdę chcesz poznać strukturę tego wszystkiego to czeka Cie zabawa z systemami plików :) Polecam zacząć właśnie od FAT bo jest bardzo prosty. Możesz zajrzeć na projekt, który robiłem jakiś czas temu. On operuje właśnie na surowej partycji i wyciąga takie informacje z FAT32, żeby wiedzieć gdzie fizycznie na dysku leży folder, pliki itp. https://github.com/stryku/HideMeFatty

Bardzo pomocne jest też http://wiki.osdev.org/FAT Tam masz praktycznie wszystko
Dodam tylko, że inne popularne systemy plików czyli ext* ntfs są o wiele bardziej skomplikowane.

Możliwe, że Cie nie zrozumiałem (inni chyba też). Jak możesz daj jakiś przykład.

0

Ale popatrz:
https://pl.wikipedia.org/wiki/ID3
Pierwotnie pliki mp3 zawierały jedynie podstawowe informacje o pliku. Rozwiązanie tego problemu było dodanie na końcu pliku 128 bajtów dodatkowych danych, które pozwalały na opis zawartości pliku
Czyli twierdzisz, że gdy otworze plik mp3 tradycyjnie, std::fstream, to zobacze te dane? I tak będzie z każdymi danymi będącymi w pliku, tak? ("W obrazach jest exif, w mp3 jest ID3, w avi jest bitrate i inne takie") Reszte (data modyfikacji już wspomniana na przykłąd) trzyma OS / system plików. W swój tajemniczy sposób.

0

Oczywiście! Otwórz jakieś mp3 czy inny plik w hexedytorze, spędź trochę czasu i zobacz, że wszystko tam jest

0

No dobra, może mi to wystarczy. Chyba sądziłem, że to łatwiejsza sprawa. Dzięki wielkie.

0

A co może być łatwiejszego niż zwykłe otwarcie pliku przy pomocy std::fstream i czytanie tego co tam jest?

Załączam jeszcze dowód (: Otworzyłem plik mp3 w notepad++ i oto co w nim jest. Jak widać na początku jest nagłówek ID3

0

Data modyfikacji i inne umieszczone sa zależnie od filesystemu - od tego są funkcje systemowe - pod linuksem funkcja stat na przykład.

1 użytkowników online, w tym zalogowanych: 0, gości: 1