Невозможно скопировать байтовый массив фиксированного размера из структуры в другой массив в структуре в C# - PullRequest
0 голосов
/ 05 мая 2020

Используя функцию NetworkInfo2SecurityParameter, я пытаюсь скопировать буфер фиксированного размера unkRandom из структуры LdnNetworkInfo, содержащейся в структуре NetworkInfo, в буфер структуры SecurityParameter.

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

Ошибка происходит в функции Buffer.MemoryCopy(). Ошибка: «Вы не можете использовать буферы фиксированного размера, содержащиеся в нефиксированных выражениях. Попробуйте использовать оператор fixed»

unsafe void NetworkInfo2SecurityParameter(NetworkInfo info, out SecurityParameter output)
{
    output = new SecurityParameter();
    output.sessionId = info.networkId.sessionId;
    Buffer.MemoryCopy(output.unkRandom, info.ldn.unkRandom, 16, 16);
}

struct SecurityParameter {
    public unsafe fixed byte unkRandom[16];// = new byte[16];
    public SessionId sessionId;
};

struct NetworkInfo : /sf::/LargeData {
    public NetworkId networkId;
    public CommonNetworkInfo common;
    public LdnNetworkInfo ldn;
};

struct LdnNetworkInfo {
    public unsafe fixed byte unkRandom[16];// = new byte[16];
    public ushort securityMode;
    public byte stationAcceptPolicy;
    public unsafe fixed byte _unk1[3];// = new byte[3];
    public byte nodeCountMax;
    public byte nodeCount;
    //TODO non primitive array,,
    private unsafe fixed byte _nodes[sizeof(NodeInfo)*NodeCountMax]; //Needs to be fixed array, and needs to be casted to NodeInfo span, so thats why its size is this
    public unsafe fixed Span<NodeInfo> nodes => MemoryMarshal.Cast<byte, NodeInfo>(MemoryMarshal.CreateSpan(ref _nodes[0], 128));
    public ushort _unk2;
    public ushort advertiseDataSize;
    public unsafe fixed byte advertiseData[AdvertiseDataSizeMax];// = new byte[AdvertiseDataSizeMax];
    public unsafe fixed byte _unk3[148];// = new byte[148];
};

1 Ответ

0 голосов
/ 05 мая 2020

Исправлено с помощью этого подхода: я создал новую переменную с именем ret, в которую я скопировал данные, а затем назначил ret для вывода.

unsafe void NetworkInfo2SecurityParameter(NetworkInfo info, out SecurityParameter output)
        {
            var ret = new SecurityParameter();
            output.sessionId = info.networkId.sessionId;
            Buffer.MemoryCopy(ret.unkRandom, info.ldn.unkRandom, 16, 16);
            output = ret;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...