C# BinaryWriter/BinaryReader — порядок чтения не соответствует порядку записи

У меня есть некоторые воксельные данные, которые я хотел бы сохранить с помощью BinaryWriter, а затем прочитать с помощью BinaryReader, но я столкнулся с некоторыми проблемами.

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

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

Block[] blocksToSave = chunk.blocks.GetBlocks();

using (BinaryWriter writer = new BinaryWriter(File.Open(Application.persistentDataPath + "/test.bin", FileMode.OpenOrCreate)))
{
    for (int i = 0; i < blocksToSave.Length; i++)
    {
        writer.Write(blocksToSave[i].id); // The ID is just a byte value.
    }
}

byte[] loadedBlocks = new byte[Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE]; // 16 * 16 * 16
using (BinaryReader reader = new BinaryReader(File.Open(Application.persistentDataPath + "/test.bin", FileMode.Open)))
{
    int pos = 0;
    int index = 0;
    int streamLength = (int)reader.BaseStream.Length;

    while (pos < streamLength)
    {
        byte id = reader.ReadByte();
        loadedBlocks[index] = id;
        pos += sizeof(int);
        index++;
    }
}

if (blocksToSave.Length != loadedBlocks.Length)
{
    Debug.LogError("Sizes does not match!");
    return;
}

for (int i = 0; i < blocksToSave.Length; i++)
{
    if (blocksToSave[i].id != loadedBlocks[i])
    {
        Debug.LogError("Expected " + blocksToSave[i].id + " but got " + loadedBlocks[i] + " at index " + i + ".");
        return;
    }
}

Мы очень ценим любую помощь, чтобы понять, в чем проблема!
Спасибо.


person Hertzole    schedule 24.01.2020    source источник
comment
sizeof(int) равно 4 (байтам), но вы читаете байты - это преднамеренно?   -  person C.Evenhuis    schedule 25.01.2020
comment
Протестировано с sizeof(byte) и работает   -  person Steve    schedule 25.01.2020
comment
@C.Evenhuis Я невероятно слеп. Раньше я работал с целыми числами, изменил его на байты, а потом, наверное, забыл, что работаю с байтами. Спасибо, что указали на это.   -  person Hertzole    schedule 25.01.2020
comment
@Hertzole случается со всеми нами :)   -  person C.Evenhuis    schedule 25.01.2020


Ответы (1)


pos += sizeof(int);

должно быть

pos += sizeof(byte);

person NotTheBatman    schedule 24.01.2020
comment
Оказывается, я просто слеп. Раньше я использовал целые числа, переключился на байты, забыл изменить свое сохранение и не думал о том, что использую байты. Спасибо. - person Hertzole; 25.01.2020