2016-10-27 10 views
-1

所以我有一個二進制文件,我正在讀取一個字節值是2個字節的值是一個Int16 = 43140,然而無論何時我在Delphi中讀取它返回爲43104,我寫了在C#中讀取它的代碼只是爲了測試,它正確讀取它只是在Delphi中它讀取不正確,它看起來像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]會有幫助。猜測可能是錯誤的是不可能的。您的代碼也不會使用Stream閱讀器。你真的問什麼問題? –

+0

讓我一起敲一個,我用SysUtils的Stream reader和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