C #: запись значений в двоичный (.bin) формат файла

#c# #.net #binary #hex #binaryfiles

#c# #.net #двоичный #шестнадцатеричный #двоичные файлы

Вопрос:

Итак, допустим, у меня есть следующие значения:

 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 значения являются целыми числами, их следует преобразовать в шестнадцатеричный формат, а затем записать в файл .bin

    ВЫХОДНОЙ файл (.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, но по какой-то причине все значения записываются в виде шестнадцатеричных строк, а не так, как я хочу.

Ответ №1:

Использование BinaryWriter — правильное решение.

Не поддавайтесь искушению использовать BinaryWriter.Write(String) перегрузку — она добавляет к строке префикс длиной в один байт, а это не то, что вам нужно.

Также обратите внимание, что я явно привел каждое значение к a (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);
        }
    }
}
 

Результат:
Вывод в шестнадцатеричном редакторе

Комментарии:

1. Идеально, это именно то, что я искал, я хотел спросить вас, есть ли способ создать код, который работает для любого типа, например, допустим, у меня есть массив различных типов значений, и я просто хочу перебрать их, записать его в двоичный файл без необходимости проверять каждый тип значения.

2. В общем, то, что вы имеете в виду, называется сериализацией . См. Эту статью в MSDN и эту статью в Википедии . В общем, однако, если вы работаете с каким-то конкретным двоичным форматом, подобным этому, лучше всего реализовать его по полям, как это. Убедитесь, что все типы полей работают, затем завершите это библиотекой, которая может принимать массив объектов и записывать их в правильном формате.

3. Как вы можете сделать так, чтобы созданный двоичный файл менялся с 00 на FF и помещал 00 там, где нет никаких данных?

4. @JonathonReinhart Это лучший способ написать byte[] ?

5. У @PrashantPimpale BinaryWriter Write(Byte[]) перегрузка.