二进制文件的读写(100分)

  • 主题发起人 主题发起人 SBSB174
  • 开始时间 开始时间
S

SBSB174

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个二进制数据如下:
(#1,#0,#4,'
 
你的ini文件中除了这些数据还有其它东西吗?
其实放在一个单独的文件中比较方便操作。
 
procedure TForm1.Button2Click(Sender: TObject);
var
f:file of char;
c:array of char;
n,i:integer;
begin
assignFile(f,'d:/temp1');
reset(f);
n:=filesize(f);//长度
showmessage(inttoStr(n));
SetLength(c,n);
i:=0;
while not(eof(f)) do
begin
inc(i);
Read(f,c[i-1]);
end;
CloseFile(f);
// 处理
SetLength(c,0);
end;
 
const
nMax=20;
//二进制数量
var
tempstr:string;
ts:array[0..nMax] of char;
begin
tempstr:=从ini文件中读出;
 for i:=0 to length(tempstr)-1 do
begin
ts:=tempstr[i+1];
end;
end;
 
procedure SaveDataToIni(const S, IniFileName, IniSection: String);
var
sHex: String;
I, M, N, X, Y: Integer;
procedure AddChar(D: Integer);
begin
Inc(N);
if D < 10 then

sHex[N]:= Chr(D + Ord('0'))
else
begin
Dec(D, 10);
sHex[N]:= Chr(D + Ord('A'));
end;

end;
begin
SetLength(sHex, 131);
M:= 0;
repeat
N:= 2;
for I:= 1 to 64 do
begin
Inc(M);
if M > Length(S) then
Break;
X:= Ord(S[M]);
AddChar(X div 16);
AddChar(X mod 16);
end;
Inc(N);
sHex[N]:= #0;
N:= M div 64;
sHex[1]:= Chr(N + Ord('A'));
sHex[2]:= #0;
WritePrivateProfileString(PChar(IniSection), @sHex[1], @sHex[3], PChar(IniFileName));
until M >= Length(S);
Str(Length(S), sHex);
WritePrivateProfileString(PChar(IniSection), 'DataSize', PChar(sHex), PChar(IniFileName));
end;

function GetDataFromIni(const IniFileName, IniSection: String): String;
var
HexChar: String[16];
Id: String[2];
I, M, N, T, X, DataSize: Integer;
begin
DataSize:= GetPrivateProfileInt(PChar(IniSection), 'DataSize', 0, PChar(IniFileName));
if DataSize = 0 then
Exit;
SetLength(Result, DataSize + 256);
HexChar[0]:= Chr(16);
for I:= 0 to 9 do
HexChar[I+1]:= Chr(I + Ord('0');
for I:= 10 to 15 do
HexChar[I+1]:= Chr(I + Ord('A');
Id:= 'A'#0;
M:= 1;
repeat
N:= GetPrivateProfileString(PChar(IniSection), @Id[1], '', @Result[M], PChar(IniFileName)) div 2;
for I:= 0 to N - 1 do
begin
T:= M + I + I;
X:= Pos(Result[T], HexChar) * 256 + Pos(Result[T+1], HexChar);
Result[M+I]:= Chr(X);
end;
Inc(M, N);
Id[1]:= Succ(Id[1]);
until M > DataSize;
SetLength(Result, DataSize);
end;
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IniFiles;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
Ini : TIniFile;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.INI'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(Ini) then
FreeAndNil(Ini);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
S : TStream;
V : String;
I : Integer;
begin
S := TMemoryStream.Create;
try
Ini.ReadBinaryStream('Data', 'Value', S);
SetLength(V, S.Size);
S.Read(V[1], S.Size);
for I := 1 to Length(V) do
Memo1.Lines.Add(IntToHex(Ord(V), 2));
finally
S.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
Data : array[0..7] of char =
(#0, #1, #2, #3, #4, #5, #6, #7);
var
S : TStream;
begin
S := TMemoryStream.Create;
try
S.Write(Data, SizeOf(Data));
S.Seek(0, sobegin
ning);
Ini.WriteBinaryStream('Data', 'Value', S);
finally
S.Free;
end;
end;

end.
 
to zw84611:
有其它内容
to jsxjd, windbell:
可能是我没说清楚,我在ini文件中有多项是这些char数组,并每个数组的长度不一定相等,
to SupermanTm:
这个函数好象少了一个参数
GetPrivateProfileString(PChar(IniSection), @Id[1], '', @Result[M], PChar(IniFileName)) div 2;
to tseug:
如果我在
Data : array[0..7] of char =
(#0, #1, #2, #3, #4, #5, #6, #7);
中有数字,如(#0, #1, #2, #3, #4, #5, #6, 18,#7)编译就会出错,怎么办呢,谢谢
 
你的 ini 文件如果是注册文件的话,只能为文本文件。
那些不可见字符能保存到ini 注册文件中吗?
 
思路是这样的
定义动态char 数组
save 和 load 都动作二进制文件处理,
save 在文件中记录char 数组的长度
load 动态分配char 数组的长度,read 就可以了
 
既然你的都是字符, 那么数字你可以把它变成字符处理,比如说数字,18可以用
#18来表示, 不过, 仅限于1个字节的数字. 像ShortInt和Byte这样的
 

18不是char类型,所以会出错
多项这种数组是不是根据选择类型不同而读不同的值?可以将长度也写入ini文件中
其实,直接用file of byte读写就行了,为什么要不断地转换类型呢?
 
后退
顶部