Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение байтов из файла [D7]


Страницы:   1 2

8ung ©   (2004-08-31 11:26:00) 

Как читать байты из файла, сохраняя их последоватьльность?
Например:
В файле первые четыре байта - $08 $58 $49 $FC
При счтитывании этих четырех байт возвращается $FC495808(так ка и должно быть), а мне нужно, чтобы возвращалось $085849FC.


GuAV   (2004-08-31 14:14:00) [1]

BSWAP надо


Dyn`alt   (2004-08-31 14:11:00) [2]

var
 Bytes: array[0..3] of Byte;
 Int: Integer absolute Bytes;

Из файла читаешь в Bytes, потом юзаешь Int


КаПиБаРа   (2004-08-31 14:07:00) [3]

8ung   (31.08.04 11:26)

> При счтитывании этих четырех байт возвращается
> $FC495808(так ка и должно быть), а мне нужно, чтобы
> возвращалось $085849FC

После считывания поменяй байты местами.


GuAV   (2004-08-31 14:00:00) [4]


> htonl()

или ntohl :)

=======
Q: What is the difference between htonland ntohl?
Is this an implementation of the joke that Nikita Khrushchev
divided the Ministry of Transport into two parts: "(to) there" and "back (from there)".
A: The difference between those is that host order is different (and opposite) from network byte order.


5 копеек   (2004-08-31 13:54:00) [5]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Grids;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   StringGrid1: TStringGrid;
   OpenDialog1: TOpenDialog;
   procedure Button2Click(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private-Deklarationen }
 public
   { Public-Deklarationen }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
begin
 Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Datei: file of byte;
   Zeichen: Byte;
   iSpalte, iDeltSpalte, iZeile: integer;
   TmpStr: string;
begin
 if OpenDialog1.Execute then
 begin
   AssignFile(Datei,OpenDialog1.FileName);
   Reset(Datei);
   try
     iSpalte := 0;
     iDeltSpalte := 0;
     iZeile := 0;
     while not Eof(Datei) do
     begin
    BlockRead(Datei,Zeichen,1);
       TmpStr := IntToHex(Zeichen,1);
       if Length(TmpStr) < 2 then
         TmpStr := '0' + TmpStr;
       StringGrid1.Cells[iSpalte + iDeltSpalte,iZeile] := TmpStr;
       if iSpalte < 3 then
         Inc(iSpalte)
       else begin
         iSpalte := 0;
         if iDeltSpalte < 20 then
           iDeltSpalte := iDeltSpalte + 5
         else begin
           iDeltSpalte := 0;
           Inc(iZeile);
           StringGrid1.RowCount := StringGrid1.RowCount + 1;
         end;
       end;
     end;
     
   finally
     CloseFile(Datei);
   end;
 end;
end;

end.


Digitman   (2004-08-31 13:38:00) [6]


> 8ung


читай как читаешь, т.е. в Integer, и тут же пользуй для изменения порядка следования байт прочитанного значения ф-цию htonl() из состава Winsock, если уж так тяжко реализовать этот примитивный алгоритм самостоятельно


Ega23   (2004-08-31 13:21:00) [7]

Tiff ковыряешь?


П7   (2004-08-31 13:03:00) [8]

Читай из потока... TFileStream...


Reindeer Moss Eater   (2004-08-31 12:59:00) [9]

Возьми word
Прочитай в него первые два байта
Сдвинь влево на 16 бит.
Прочитай вторые два байта.


Vitaly   (2004-08-31 12:54:00) [10]


> У меня дальше пойдет чтение блоков по 10-16 байт, а в интегер
> это не засунешь(всего 8 байт)...

и при чем здесь значение инта?


8ung   (2004-08-31 12:05:00) [11]


> Тип Integer не 8 Byte, а 4.

Путал...

> Кроме того, вероятно ты что-то путаешь с представлением
> байтов. Посмотри внимательно, скорее всего у тебя байты
> перевёрнуты попарно, а не все четыре.

Перевернуты все четыре и я ничего не путаю. Так оно и должно быть.


5 копеек   (2004-08-31 11:59:00) [12]

Тип Integer не 8 Byte, а 4.

Кроме того, вероятно ты что-то путаешь с представлением байтов. Посмотри внимательно, скорее всего у тебя байты перевёрнуты попарно, а не все четыре.


8ung   (2004-08-31 11:58:00) [13]


> Reindeer Moss Eater ©   (31.08.04 11:55) [15]
> Код записи этих байтов в файл где?
> Не тормози.
> Сникерсни!

Если кто тормозит, так это ты...
Я читаю посторонний файл!!! Не я пишу туда.


Reindeer Moss Eater   (2004-08-31 11:55:00) [14]

Код записи этих байтов в файл где?
Не тормози.
Сникерсни!


8ung   (2004-08-31 11:53:00) [15]

Неужели никто не поможет?


Reindeer Moss Eater   (2004-08-31 11:53:00) [16]

Тогда почему работаешь с блоками и перемеными длиной 4 байта?


8ung   (2004-08-31 11:52:00) [17]


> Reindeer Moss Eater ©   (31.08.04 11:48) [9]
> Во первых зачем буфер, если читать можно прямо в переменную
> integer?
> Во вторых где код записи?

У меня дальше пойдет чтение блоков по 10-16 байт, а в интегер это не засунешь(всего 8 байт)...


Reindeer Moss Eater   (2004-08-31 11:51:00) [18]

Сникерсни и поймешь при чем здесь запись.


8ung   (2004-08-31 11:50:00) [19]


> Reindeer Moss Eater ©   (31.08.04 11:43) [6]
> Читаешь в интегер - значит и пиши из него.

При чем тут запись?
Если в файле первые четыре байта $08 $58 $49 $FC и мне нужно получить число $085849FC, но при стандартном чтении получаю $FC495808.


Reindeer Moss Eater   (2004-08-31 11:48:00) [20]

Во первых зачем буфер, если читать можно прямо в переменную integer?
Во вторых где код записи?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо