2014-06-23 176 views
0

因此,可以說,我有以下值:C#:寫值轉換爲二進制(.bin文件)文件格式

HEADER01 48 45 41 44 45 52 30 31 
06/17/14 30 36 2F 31 37 2F 31 34 
1.0   31 2E 30 

0x0000  00 
0x0027  27 
0x0001  01 
0x0001  01 
0x0001  01 
0x0001  01 
0x0028  28 

192   C0 
168   A8 
1   01 
1   01 
  • 前3個值是字符串,應轉換爲ASCII十六進制值,然後寫在bin文件

  • 下7倍的值是十六進制,應寫入在bin文件

  • 最後4個值是整數,應轉換爲HEX AS-IS,然後瓦特雷農在.bin文件

    OUTPUT(.bin文件)的文件應該是這個樣子:

    00000000 48 45 41 44 45 52 30 31 30 36 2F 31 37 2F 31 34 
    00000010 31 2E 30 00 27 01 01 01 01 28 C0 A8 01 01 00 00 
    00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    

是否有可能創建一個(.bin文件)文件中像這樣使用C#.NET?

我試過BinaryWriter,StreamWriter,但由於某些原因,所有的值都寫成HEX字符串,而不是我想要的。

回答

3

使用BinaryWriter是正確的解決方案。

不要掉進使用BinaryWriter.Write(String)重載的誘惑 - 它將字符串前綴爲單字節長度,這不是你想要的。

另請注意,我已明確地將每個值轉換爲(byte)。如果我沒有這樣做,那麼編譯器會選擇Write(int)超載,將4個字節寫入文件。

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var s = File.OpenWrite("temp.bin")) { 
      var bw = new BinaryWriter(s); 

      bw.Write(Encoding.ASCII.GetBytes("HEADER01")); 
      bw.Write(Encoding.ASCII.GetBytes("06/17/14")); 
      bw.Write(Encoding.ASCII.GetBytes("1.0")); 

      bw.Write((byte)0x00); 
      bw.Write((byte)0x27); 
      bw.Write((byte)0x01); 
      bw.Write((byte)0x01); 
      bw.Write((byte)0x01); 
      bw.Write((byte)0x01); 
      bw.Write((byte)0x28); 

      bw.Write((byte)192); 
      bw.Write((byte)168); 
      bw.Write((byte)1); 
      bw.Write((byte)1); 
     } 
    } 
} 

結果: Hex editor output

+0

完美,這正是我一直在尋找,我想問問你,雖然,有沒有一種方法來創建任何類型的工作的代碼,例如讓說我有一個不同的值類型的數組,我只是想循環通過他們寫它的二進制文件,而不必檢查每個值類型。 –

+1

一般來說,你指的是* serialization *。請參閱此[MSDN文章](http://msdn.microsoft.com/en-us/library/ms233843.aspx)和本[Wikipedia文章](http://en.wikipedia.org/wiki/Serialization)。但是,一般來說,如果您正在使用某種特定的二進制格式,最好像這樣逐字段地實現它。讓字段類型全部工作,然後用一個庫來包裝它,該庫可以接收一組對象並以正確的格式寫出它們。 –

+0

好吧完美我會研究一下,謝謝Jonathon! –