2014-06-23 135 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! –