Re[8]: SWAP32
От: Серж  
Дата: 01.09.15 17:38
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>ты мужественно пытаешься преодолеть собственные косяки в коде.

AC>показывай как читаешь и как пишешь.

Ошибся немножко, вот правильное трактование:
% SWAP и сохранение в переменную TimeW1: file (FC 41 22 C5) %
А вот как пишу:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
  function Swap32(Value: LongWord): LongWord;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  F,F1: File;
  NumRead, NumWrite: Integer;
  TimeW0,TimeW1,TimeW2: LongWord;
  Offset: Integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  AssignFile(F, 'C:\LOG001');
{$I-}
  Reset(F, 1);
{$I+}
  if IOResult<>0 then Halt;
  Offset := StrToInt(Edit1.Text);
  Seek(F, Offset);
  BlockRead(F, TimeW0, 4, NumRead);
  TimeW1 := Swap32(TimeW0);
  Label1.Caption := IntToStr(TimeW0);
  Label2.Caption := IntToStr(TimeW1);
  CloseFile(F);
  AssignFile(F1, 'C:\LOG001_rewrite');
{$I-}
  Rewrite(F1, 1);
{$I+}
  Seek(F1, 0);
  BlockWrite(F1, TimeW0, 4, NumWrite);
  Seek(F1, 16);
  BlockWrite(F1, TimeW1, 4, NumWrite);
  Seek(F1, 32);
  BlockWrite(F1, TimeW2, 4, NumWrite);
  CloseFile(F1);
end;

function TForm1.Swap32(Value: LongWord): LongWord;
var
B: Byte;                      //  временный байт
WordArr: array[0..3] of byte; //  массив из 4-х байт
W: LongWord absolute WordArr; //  32 битное Word с таким же начальным адресом в памяти как и массив WordArr
begin
  W := Value;                  //  присваиваем Word-у значение Word в котором нужно переставить местами байты
  B := WordArr[0];             //  присваиваем временному байту значение [0] байта массива (потому что оно затрется)
  WordArr[0] := WordArr[1];    //  присваиваем [0] байту массива значение [1] байта
  WordArr[1] := B;             //  присваиваем [1] байту массива значение временного байта
  B := WordArr[2];             //  аналогично...
  WordArr[2] := WordArr[3];
  WordArr[3] := B;
  result := W;                 
end;

end.

По умолчанию Offset := 4;
Отредактировано 01.09.2015 18:13 Серж . Предыдущая версия . Еще …
Отредактировано 01.09.2015 18:12 Серж . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.