私のwin32プログラムは、文字列[32]とその直後の整数のみを含むバイナリファイルを作成しました。次に、同じファイルを読み取るための.NETプログラムを作成しました。
これが私の.NETコードです:
method ReadUnitFile;
var
FHeader:TFileHeader;
Biread:BinaryReader;
FUnitLoc:String;
begin
FUnitLoc := baseDir+'\system\Units.dat';
if Environment.OSVersion.Platform = System.PlatformID.Unix then
FUnitLoc := baseDir+'/system/Units.dat';
if File.Exists(FUnitLoc) then
begin
Biread:= new BinaryReader(File.OpenRead(FUnitLoc));
FHeader.id:=Biread.ReadString;
FHeader.version:=Biread.ReadInt32;
Biread.Close;
end;
end;
おそらくファイルの読み取りに失敗しました。実際、「ファイルの終わりを超えて読み取る」例外が発生しました。その理由は、文字列が正確に32文字の長さであるためです。BinaryReaderには情報がないと思います。したがって、文字列に対して32文字を超えて読み取ります。したがって、バイナリファイルを正しく読み取ることができません。
では、この場合、.NETFrameworkでbinary-win32-fileをどのように読み取るのでしょうか。
アップデート
これが私の.NET更新コードです:
method ReadUnitFile;
var
FHeader:TFileHeader;
Biread:BinaryReader;
FUnitLoc:String;
tmparray:array[0..32] of char;
begin
FUnitLoc := baseDir+'\system\Units.dat';
if Environment.OSVersion.Platform = System.PlatformID.Unix then
FUnitLoc := baseDir+'/system/Units.dat';
if File.Exists(FUnitLoc) then
begin
Biread:= new BinaryReader(File.OpenRead(FUnitLoc));
Biread.Read(tmparray,0,32);
FHeader.id := tmparray.ToString;
FHeader.version:=Biread.ReadInt32;
Biread.Close;
end;
end;
これは機能しますが、tmparrayから文字列を取得できないようです。FHeader.idは文字列型です。ToStringが正しく機能していないようです。そのコード行の後、FHeader.idは「System.Char[]」と等しくなります。実際には文字列自体は含まれていません。
何か案が?
前もって感謝します、