C# BinaryWriter / BinaryReader - порядок чтения не соответствует порядку записи - PullRequest
0 голосов
/ 25 января 2020

У меня есть некоторые воксельные данные, которые я хотел бы сохранить с помощью 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;
    }
}

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

1 Ответ

3 голосов
/ 25 января 2020

pos += sizeof(int);

должно быть

pos += sizeof(byte);

...