O formatach plików itd nie mam praktycznie pojęcia stąd też ten topic.
Po kolei...
Na dysku mam obrazek w formacie *.BMP, szerokość obrazka to: 639 pixeli.
Wg wikipedii, cztery bajty licząc od 18-ego bajta od początku pliku, zawierają informację o szerokości obrazka. Ok, to 4 bajty od 18-ego = szerokość. W HEX edytorze te bajty wyglądają tak (po kolei, od osiemnastego):
7F
02
00
00
Czyli 7F02? No to zamieniam hex na dec i mam wynik: 32514, a przecież szerokość obrazka to 639 pixeli, coś jest nie tak.
No to od tyłu czytam bajty, czyli nie od osiemnastego po kolei, tylko od 21-ego bajta do 18-ego.
Czyli 7F02 to będzie 027F i teraz zamieniam to na dec i wynik to: 639. Wow, zgadza się.
I teraz pytanie do was - dlaczego bajty czyta się od tyłu w plikach BMP? w plikach np. mp3 czyta się po kolei (przynajmniej tam gdzie są tagi, informacje o wykonawcy piosenki itd, czyli chyba wielkość pliku - 127 bajtów (nie pamiętam) i lecą tam bajty ładnie po kolei, od lewej do prawej i ładnie czyta się ascii. Skąd program wie jak to czytać? Czy może wszędzie tak jest, a tylko tagi itd w pliku mp3 (czyli końcówka pliku) to celowa zagrywka, by było wygodnie?
A tak na marginesie, lamerski kod w delphi:
var
Buffer: array[1..4] of Char;
F: File;
begin
AssignFile(F, 'd:\test.bmp');
Reset(F, 1);
Seek(F, 18);
BlockRead(F, Buffer, 4);
CloseFile(F);
Form1.Caption:= IntToStr(Ord(Buffer[1]));
end;
Ktoś mi powie, czy w ogóle tak kod na odczytanie szerokości powinien wyglądać? czy inaczej? Działać, działa, bo odczytuje szerokość obrazka. Chciałbym też prosić o wyjaśnienie kodu, jako, że ja laik w delphi. Sam z siebie powiem co rozumiem dobrze, bądź źle. Skomentowany kod:
var
Buffer: array[1..4] of Char; {deklaracja tablicy, jako, że 4 bajty chcę odczytać to 1..4, a typ Char, bo tak se wylosowałem, zakres 0-255}
F: File; //to wiadomo, plik
begin
AssignFile(F, 'd:\test.bmp'); //skojarzenie
Reset(F, 1); //otworzenie pliku
Seek(F, 18); //przesunięcie pliku, "kursora" na 18 bajt
BlockRead(F, Buffer, 4); {odczytanie 4 bajtów do tablicy Buffer, w debuggerze odczyta mi jakieś krzaki przez to "char", nawet jak HEXy to 00 na trzecim i czwartym bajcie, to widzę tam krzaki, na dodatek różnią się, choć hexy te same, dopiero jak zmienię typ tablicy z char na byte to mam normalne liczby, czyli tablica ma wtedy elementy: 127, 2, 0, 0 (czyli hexy 7F, 02, 00, 00)}
CloseFile(F);
Form1.Caption:= IntToStr(Ord(Buffer[1])); {dałem Ord na chara, wyszedł int, to na Stringa przerobiłem i tyle. A to w klamrze [1], to co to jest? że Ord(Buffer[1]) to znaczy, że chcę pobrać kod ascii pierwszego znaku z tablicy? jeśli tak, to czemu program daje mi Orda wszystkich znaków, tzn. sam czyta 4 elementy tablicy od tyłu zamiast tylko pierwszy element, który dałby wynik 127 (bo 7F)}
end;
Zatem, jeśli ma ktoś z was cierpliwość, to proszę o wyjaśnienie mi tych spraw. Dziękuję.