![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение байтов из файла [D7]
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 betweenhtonlandntohl?
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?
Во вторых где код записи?