2009-11-05 35 views
-1

我正在將一些生成二進制文件的舊C代碼移到我們的C#系統中。問題是,生成的二進制文件仍然需要被另一箇舊的C程序讀取。在C#中編寫一個二進制文件,由C程序用指針讀取?

原代碼的幾個結構輸出到一個二進制文件,其中很多人結構中包含鏈表,與* next指針。

我如何在C#寫這些讓原本計劃將仍然能夠讀?

舊的C代碼讀取和文件的整體結構寫的時間,與freads和fwrites即

我無法找到一大堆信息中對如何FWRITE將輸出指針,等

回答

3

如果你的代碼是根據讀取和寫入指針值到一個文件,那麼它是壞了。每次運行程序時,它都可能有一個稍微不同的內存佈局。

而是寫指針你也許應該轉換成指針文件偏移的寫入和轉換文件偏移回球上閱讀。

(這適用於C,C++和C#)

+1

我認爲我們可以假設指針在閱讀後重新填充。 – 2009-11-05 19:49:09

+0

你是對的。有時候,當然,不是爲了I/O而使用單獨的C結構,而是爲了真正的鏈接列表而在內存中使用單獨的C結構,只需將鏈表結構全部吐出(指針和全部),然後在讀取它們時將它們拼接在一起更容易。在C#中讀取它們時,只需將其視爲32(或64)位值並忽略它。 – 2009-11-05 20:20:03

+0

@亨克 - 我不同意......基於給定的代碼,我們可以假設沒有這樣的事情。此外,如果沒有傾銷額外的數據,在閱讀之後很難不可能重新填充指針。 – Aaron 2009-11-05 20:34:23

4

如果舊的代碼被寫入指針文件,那麼賠率是你處理得非常寫得不好的代碼。這些指針對讀取該文件的任何其他進程都是沒有意義的...

另外,用單個fread()讀取整個結構是一個壞主意,因爲不同的編譯器可能以不同的方式填充這些結構(所以結構由一個應用程序可能與另一個應用程序讀取的內容不同)。

1

這些指針在以C或任何其他語言閱讀後都沒有意義。我假設在閱讀後重建指針結構。這意味着您可以在閱讀/寫作時將它們視爲填充物。

在.NET中,流只接受bytebyte[]作爲數據類型,因此您必須將結構轉換爲/從該格式轉換。

一種方法是編寫自定義代碼讀/爲了寫場。給你最多的控制權,但是它是很多工作。

另一種方法是映射你的結構到一個byte []批發,我會找一個例子。

0

你可以(正確)寫指針到磁盤的唯一方法是,如果你使用類似based addressing

鏈接的列表,它包含的基於指針 指針可以 保存到磁盤,然後重新加載到 內存中的另一個地方, 指針保持有效。

在C#中處理這將是非常困難的,並且在序列化過程中需要某種映射層。

+0

在C#中處理這將是_impossible_。 GC會將東西移動,並且長時間固定大量數據不是一種選擇。 – 2009-11-05 20:29:38

+0

關鍵是使用這種格式文件不包含真正的指針,只是偏移量。您可以通過將對象映射到您指定的偏移量來處理此問題...很困難但並非不可能。 – 2009-11-05 21:07:57

0

指針指向一個內存位置,當你將一個指針存儲在一個文件中時,它是沒有意義的,它指的是短暫的東西。所以無論在這個應用程序中都沒關係,因爲引用的數據是被分散的,或者你沒有正確地聲明格式。通常在這種情況下,您會應用'序列化',以便所指向的數據也被存儲在文件中,以便原始數據及其指向的內容可以在稍後時間重建('反序列化') 。

有C和C#的文件存儲之間沒有根本的區別 - 這是獨立於語言的,但有可能在結構上的堆積差異,所以只存儲結構始終是一個糟糕的主意(結構包裝甚至可以不等C編譯器)。當然,您還需要了解C#中的char類型是16位而不是8位。您需要讓現有存儲格式成爲規範,然後使用序列化在C#中實現,以避免結構實現方面的差異。