BinaryWriter.Write(Int32)

У меня есть файл, содержащий такую ​​структуру:

public struct index
{
    public string word;         //30 bytes
    public int pos;             //4 bytes
};

Что касается слова, то перед его записью я расширяю его до 30 байт, а затем пишу как есть, потому что знаю, что int32 занимает 4 байта.

Вот код для записи в файл:

for (i = 0; i < ind.word.Length; i++)
{
   bword[i] = (byte)idx_array[l].word[i];
}
for (; i < SIZE_WORD; i++) //30
{
   bword[i] = 0;
}
bw_idx.Write(bword, 0, SIZE_WORD);
bw_idx.Write(ind.pos);

Код компилируется и работает хорошо, за исключением одного: int32 не записывается. Если я проверю файл с помощью notepad ++, я увижу это, где должно быть int: SOH NULL NULL NULL Я посмотрел SOH, и предполагается, что это SOH (начало заголовка):

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

Может ли кто-нибудь из вас понять, почему мой int32 не пишет?

код для вас, чтобы попробовать (файл будет сохранен в папке bin отладки проекта):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace test_write
{
    class Program
    {
        struct enreg
        {
            public string word;
            public int pos;
        }

        const int SIZE_WORD = 30; //30 bytes
        const int SIZE_POS = 4; //4 bytes

        static byte[] bword = new byte[SIZE_WORD];        
        static byte[] bpos = new byte[SIZE_POS];

        static void Main(string[] args)
        {
            enreg enr = new enreg();

            Console.Write("word : ");
            enr.word = Console.ReadLine();
            Console.Write("\anumber : ");
            enr.pos = int.Parse(Console.ReadLine());

            FileStream fs = File.Open("temp", FileMode.Create, FileAccess.ReadWrite);
            BinaryWriter bw = new BinaryWriter(fs);

            int i = 0;
            for (i = 0; i < enr.word.Length; i++)
            {
                bword[i] = (byte)enr.word[i];
            }
            for (; i < SIZE_WORD; i++)
            {
                bword[i] = 0;
            }
            bpos = BitConverter.GetBytes(enr.pos);

            bw.Write(bword, 0, SIZE_WORD);
            bw.Write(bpos, 0, SIZE_POS);

            fs.Close();

        }
    }
}

person AntoineLev    schedule 08.12.2012    source источник
comment
Я думаю, вам лучше использовать шестнадцатеричный редактор вместо Notepad++. Frhed — хороший сайт с открытым исходным кодом. Также проверьте, правильно ли вы закрыли (или сбросили) файл.   -  person Alvin Wong    schedule 08.12.2012
comment
Кроме того, я не вижу FileStream.Write(Int32). Вы имеете в виду BinaryWriter.Write(Int32)?   -  person Alvin Wong    schedule 08.12.2012
comment
он хорошо закрыт, и даже если бы у меня был смыв, это не сработало бы   -  person AntoineLev    schedule 08.12.2012
comment
Возможно, вам следует изолировать проблему и предоставить нам короткий автономный код, чтобы воспроизвести проблему.   -  person Alvin Wong    schedule 08.12.2012
comment
Не уверен, что понимаю. Int было записано. В результате получилось 4 байта SOH, 0, 0, 0. Как вы думаете, почему это не было записано? Кстати, то, как вы пишете символы, не готово к юникоду.   -  person usr    schedule 08.12.2012
comment
хорошо, я ожидаю увидеть число 1 в двоичном формате   -  person AntoineLev    schedule 08.12.2012
comment
Как я уже сказал, используйте шестнадцатеричный редактор вместо Notepad++.   -  person Alvin Wong    schedule 08.12.2012
comment
Frhed даже хуже, чем notepad++, так как он показывает точки только там, где блокнот показывал SOH.   -  person AntoineLev    schedule 08.12.2012
comment
Вы в корне неправильно понимаете разницу между двоичными данными и текстом. У вас будет гораздо больше проблем с выполнением этой задачи, если это так, вы не можете записать строку с помощью BinaryWriter. Вам нужно заняться самообразованием, книга Петцольда «Кодекс» — хорошая книга.   -  person Hans Passant    schedule 08.12.2012
comment
Я могу написать строку с двоичной записью, и она работает как шарм. + это способ узнать, когда строка заканчивается в файле, определив количество байтов по умолчанию. Я согласен, что это не лучший способ сделать это, но пока я следую кодексу моего учителя. Почему я текстуально вижу слово в текстовом файле, но не число?   -  person AntoineLev    schedule 08.12.2012


Ответы (1)


BinaryWriter записывает результаты в двоичном формате. Если вы хотите вывести текст, используйте StreamWriter. Текст и байты не связаны напрямую. Вы не можете относиться к ним как к идентичным.

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

person usr    schedule 08.12.2012
comment
но да, он немного олдскул ;) - person AntoineLev; 08.12.2012