Struct to Array - Best way?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    Struct to Array - Best way?

    Hello :D

    Mein problem ist eig. schon in der Überschrift beschreiben.
    Ich möchte ein Struct in ein byte Array convertiern.

    Meine frage ist nun ob jm. eine noch bessere lösung kennt oder weiß? ?(
    Ich muss dazu sagen, das was das steht klappt schon!!!

    Mein ansatz ist momentan dieser.


    C#-Quellcode

    1. [StructLayout(LayoutKind.Explicit, Size = 4)]
    2. internal struct MysqlPacketHeader {
    3. [FieldOffset(0)]
    4. public byte Byte1;
    5. [FieldOffset(1)]
    6. public byte Byte2;
    7. [FieldOffset(2)]
    8. public byte Byte3;
    9. [FieldOffset(0)]
    10. public Payloadlength Payloadlength;
    11. [FieldOffset(3)]
    12. public byte SequenceId;
    13. public int Length => Payloadlength.Length;
    14. public MysqlPacketHeader(int length, byte sequenceId) : this() {
    15. Payloadlength = new Payloadlength(length);
    16. SequenceId = sequenceId;
    17. }
    18. }
    19. [StructLayout(LayoutKind.Explicit, Size = 3)]
    20. internal struct Payloadlength {
    21. [FieldOffset(0)]
    22. public byte Byte1;
    23. [FieldOffset(1)]
    24. public byte Byte2;
    25. [FieldOffset(2)]
    26. public byte Byte3;
    27. public int Length => (Byte3 << 16) + (Byte2 << 8) + Byte1;
    28. public Payloadlength(int length) {
    29. Byte1 = (byte)(length >> 0 & 0xFF);
    30. Byte2 = (byte)(length >> 8 & 0xFF);
    31. Byte3 = (byte)(length >> 16 & 0xFF);
    32. }
    33. }
    34. //Convert
    35. private void bla() {
    36. byte[] packedBuffer = new byte[sizeof(MysqlPacketHeader)];
    37. fixed(byte* packedBufferPtr = packedBuffer){
    38. *(MysqlPacketHeader*)packedBufferPtr = packet;
    39. }
    40. }


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Facebamm“ ()

    Facebamm schrieb:

    bessere lösung

    Was genau meinst du denn mit besser?
    Kompatibler: Mit ​Marshal.StructureToPtr() würden auch Strings richtig umgewandelt werden, was bei deiner Methode zurzeit nicht der Fall ist. In deinem Beispiel brauchst du das ja aber auch nicht.
    Performanter: Über einen Pointer das Struct auf die Adresse des Arrays setzen, da würde ich fast behaupten schneller geht es nicht mehr. Da bist du schon am Limit. Mit der Einschränkung auf unmanaged Datentypen.

    Rohdatenserialisierung von Structs​