2016-10-27 3 views
-1

私はバイナリファイルを持っており、値がInt16 = 43140の2バイトの単語値を読み込んでいますが、Delphiで読み込むと43104が返されます。 C#でそれを読み取ってテストするだけです。正しく読み込むと、正しく読み込まれていないので、0と4が何らかの理由で移動しているようです。ストリームリーダーを使用してDelphiで不思議な問題

TMyHeader= packed record 
    Value1  :String[20]; 
    Value2  :Word; // Is 43140 but reading as 43104 
    Value3  :Word; 
    Value4  :Word; // Is 43140 but reading as 43104 
    end; 

FileRead (fhandle, header, sizeof(MyHeader)); 
+1

おそらく、あなたは、ソース・ファイルにUTF-16の文字を持っています。 ANSIの代わりに。 – kami

+0

問題を示す[mcve]が役立つでしょう。何が間違っているのかを推測することは不可能です。あなたのコードはストリームリーダーも使用しません。あなたは実際に何の質問をしていますか? –

+0

私は一緒にノックさせて、私は両方のストリームリーダーとSysUtilsからのFileReadを使用して、両方が同じ結果を与える。 – kyndigs

答えて

0

コードがストリームリーダーを使用していない、それは問題は、ファイルを読み込んであることを完全にそうです。次に、TFileStreamを使用して、値を変更せずにレコードを正常に読み書きする例を示します。 (明らかにあなたが最初にあなたのシステム上で有効な、書き込み可能な場所を指すようにTestFile定数を変更する必要があります。)

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, Classes; 

type 
    TMyHeader = packed record 
    Value1: String[20]; 
    Value2: Word; 
    Value3: Word; 
    Value4: Word; 
    end; 

var 
    MyHeader: TMyHeader; 
    Stream: TFileStream; 

const 
    TestFile = 'E:\TempFiles\Testheader.bin'; 

begin 
    // Initialize the record 
    MyHeader.Value1 := 'Testing One Two'; 
    MyHeader.Value2 := 43140; 
    MyHeader.Value3 := 12345; 
    MyHeader.Value4 := 43140; 

    // Show what it contains. The `[]` brackets are to clearly delimit Value1 
    WriteLn(Format('Before write: [%s] %d %d %d', 
        [MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4])); 

    // Write it to the stream. 
    Stream := TFileStream.Create(TestFile, fmCreate, fmShareDenyNone); 
    try 
    Stream.Write(MyHeader, SizeOf(TMyHeader)); 
    finally 
    Stream.Free; 
    end; 

    // Clear the contents of MyHeader before reading back, and show the empty values 
    FillChar(MyHeader, SizeOf(TMyHeader), 0); 
    WriteLn(Format('Before read: [%s] %d %d %d', 
       [MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4])); 
    Stream := TFileStream.Create(TestFile, fmOpenRead, fmShareDenyNone); 
    try 
    Stream.Read(MyHeader, SizeOf(TMyHeader)); 
    finally 
    Stream.Free; 
    end; 
    // Output what we've read back in to verify it is correct 
    WriteLn(Format('After read: [%s] %d %d %d', 
       [MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4])); 
    Readln; 
end. 
+0

問題が見つかりました。ヘッダーに1バイトのエラーがありましたが、今は動作しています。 – kyndigs

関連する問題