【问题标题】:C#: Write values into Binary (.bin) file formatC#:将值写入二进制 (.bin) 文件格式
【发布时间】:2014-08-13 00:35:16
【问题描述】:

假设我有以下值:

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个值是STRINGS,应该转换成ASCII HEX值,然后写入.bin文件

  • 接下来的 7 个值是 HEX,应该按原样写在 .bin 文件中

  • 最后4个值是INTEGERS,应该转换成HEX,然后写入.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
    

是否可以使用 C# .NET 创建像这样的 (.bin) 文件?

我尝试过 BinaryWriter、StreamWriter,但由于某种原因,所有值都写为 HEX 字符串,而不是我想要的。

【问题讨论】:

    标签: c# .net binary hex binaryfiles


    【解决方案1】:

    使用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);
            }
        }
    }
    

    结果:

    【讨论】:

    • 完美,这正是我想要的,不过我想问你,有没有办法创建适用于任何类型的代码,例如,假设我有一个不同值类型的数组我只想循环遍历它们,将其写入二进制文件,而不必检查每个值类型。
    • 一般来说你所指的就是serialization。请参阅此MSDN article 和此Wikipedia article。不过,一般来说,如果您正在使用像这样的某种特定二进制格式,最好像这样逐个字段地实现它。让字段类型全部工作,然后用一个库包装它,该库可以获取一组对象并以正确的格式写出它们。
    • 如何使创建的二进制文件从 00 变为 FF 并将 00 放在没有任何数据的地方?
    • @JonathonReinhart 这是写byte[]的最佳方式吗?
    • @PrashantPimpale BinaryWriter 有一个 Write(Byte[]) 过载。
    猜你喜欢
    • 2013-05-09
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多