![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
обратная память
race1 © (2004-07-27 08:06:00)мне нужно прочитать заголовок файла, например, первые два байта, где первый байт плюс половина второго байта (11 бит) должно равняться FFF. в файле это записано так:
FF FD ...
а когда я читаю из TFileStream.Read(WordVar, 2), то в памяти хранится FD FF, т.е. наоборот. из-за этого неправильно находится значение нужных 11 байт - в файле всё верно (FFF), а в памяти получается FDF
как же быть?
race1 (2004-07-27 16:13:00) [1]это здорово, но для integer'а формула будет больше... вот блин, нет что бы в файл наперкосяк записать, было бы всё ок
panov (2004-07-27 15:47:00) [2]var
WordWar: Word;
begin
...
...
TFileStream.Read(WordVar, 2);
...
WordWar := (WordWar shl 8)+(WordWar shl 8);
panov (2004-07-27 15:47:00) [3]WordWar := (WordWar shl 8)+(WordWar shr8);
race1 (2004-07-27 15:31:00) [4]потому что задумал я читать mp3 файл, там есть размеры фрейма по 4 байта. так эти размеры записаны в прямом порядке (43981 записано как AB CD) а когда я читаю в переменную, то получаю CD AB или как ещё перевёрнуто незнаю
panov (2004-07-27 13:49:00) [5]Непонятно, что за задача у тебя?
Зачем заниматься таким преобразованием?
Anatoly Podgoretsky (2004-07-27 13:43:00) [6]Во втором байте только 8 бит, не 11
race1 (2004-07-27 13:15:00) [7]это простейший случай с такой проверкой. но ведь при каждом чтении придётся как-то переворачивать память что бы было так как нужно мне. может все же есть решения красивые?
Kerk (2004-07-27 09:07:00) [8]Проверять не буду. Так вижу.
> в памяти хранится FD FF
Это меня с толку и сбило. Я не к тому числу маску делал.. :)
ЮЮ (2004-07-27 09:01:00) [9]>Чего-то ты не то говоришь.
Проверь сам:
procedure TForm1.Button1Click(Sender: TObject);
var
fs: TFileStream;
w: word;
begin
fs := TFileStream.Create('a.txt', fmCreate);
w := $FDFF;
fs.Write(w, 2);
fs.Free;
end;
На диске будет записано FFFD
Kerk (2004-07-27 08:46:00) [10]
> А если запишешь на диск онять получишь FFFD, сл-но для сравнения
> используй маску $F0FF
Чего-то ты не то говоришь.
Просто челу не надо ничего преобразовывать. Он такими методами геморроя потом не оберется... :)
ЮЮ (2004-07-27 08:42:00) [11]А если запишешь на диск онять получишь FFFD, сл-но для сравнения используй маску $F0FF
Kerk (2004-07-27 08:34:00) [12]
> не знаю, где правильно, где нет, но если преобразовать число
> в WordVar в шестандатеричную систему, получим то что я сказал
Просто в памяти обратный порядок байтов, а в твоем преобразовании порядок байтов нормальный. Поэтому выглядит по-разному.
race1 (2004-07-27 08:26:00) [13]не знаю, где правильно, где нет, но если преобразовать число в WordVar в шестандатеричную систему, получим то что я сказал
ЮЮ (2004-07-27 08:19:00) [14]>а в памяти получается FDF
а ты точно именно в памяти это видишь? Это просто твой мозг меняет биты :-) Ну не приучен он ещё рассматрибать биты в памяти компьютера правмльно
Kerk (2004-07-27 08:14:00) [15]
> байт плюс половина второго байта (11 бит)
12 бит
var
a: Word;
begin
if (a and $FFF0) = $FFF0 then {бла-бла-бла}
ЮЮ (2004-07-27 08:13:00) [16]Читай побайтно