ByteArray中相同元素的值不同?

时间:2016-10-28 20:52:33

标签: c# arrays visual-studio hex

为什么在从类外部调用SetData()方法时,我在索引0而不是0xD0获取字节0x00?

这里缩短了班级:

using System;

namespace StackOverflow
{
    class Section
    {    
        uint _sectionId;
        byte[] _sectionData;

        public Section(byte[] sectionData) {
            _sectionData = sectionData;
            _sectionId = GetUShort(0x0FF4);
            Console.WriteLine(_sectionId + ": " + _sectionData[0].ToString("X")); // Gives D0
        }

        public void SetData() {
            switch (_sectionId) {
                case 0: SetTrainerInfo(); break;
                default: break;
            }
        }

        void SetTrainerInfo() {
            Console.WriteLine(_sectionId + ": " + _sectionData[0].ToString("X")); // Can Give 0

            byte[] deByte = GetBytes(0x00, 7);

            TrainerInfo.playerName = PkmString.GetString(deByte);
            Console.WriteLine(TrainerInfo.playerName + "name here");
        }
    }
}

如果在Section构造函数中调用,则可以正常工作,但不能从这样的外部源中工作:

using System;

namespace StackOverflow
{
    class SaveBlock
    {
        const short SECTIONS = 14, SECTION_SIZE = 4096;

        public Section[] sections = new Section[SECTIONS];

        public SaveBlock(byte[] blockData) {
            byte[] sectionData = new byte[SECTION_SIZE];
            for (int i = 0; i < SECTIONS; i++) {
                Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE);
                sections[i] = new Section(sectionData);
            }
        }

        public void SetForAll() {
            foreach (Section sect in sections)
                sect.SetData();
        }
    }
}

我得到同一元素的不同字节: Same byte is different

1 个答案:

答案 0 :(得分:1)

SaveBlock构造函数中查看此代码:

byte[] sectionData = new byte[SECTION_SIZE];
for (int i = 0; i < SECTIONS; i++) {
    Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE);
    sections[i] = new Section(sectionData);
}

循环将blockData字节复制到sectionData数组,然后使用sectionData创建新的Section对象实例。事情变得棘手...... 数组是引用类型。这意味着Section构造函数中的以下行仅复制对数组的引用:

_sectionData = sectionData;

当您遍历循环时,您会反复将数据复制到同一个数组实例中,然后将同一个数组实例分配给多个Section个对象的内部数据。所有这些对象都共享同一个数组实例!您很可能希望每个对象都有新数组

byte[] sectionData;
for (int i = 0; i < SECTIONS; i++) {
    sectionData = new byte[SECTION_SIZE];
    Array.Copy(blockData, SECTION_SIZE * i, sectionData, 0, SECTION_SIZE);
    sections[i] = new Section(sectionData);
}

这可能不是唯一的问题,因为_sectionId被定义为私有,初始化为非0。 SetData()方法如下所示:

public void SetData() {
    switch (_sectionId) {
        case 0: SetTrainerInfo(); break;
        default: break;
    }
}

从我们可以看到的代码中,_sectionId无法成为0,因此无法调用SetTrainerInfo()