Announcement

Collapse
No announcement yet.

Wie kann man das in C# umsetzen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann man das in C# umsetzen?

    Hallo zusammen,

    ich habe folgende Anweisung in einem c++ Programm gefunden und bekomme es nicht in C# hin. Wie müsste ich das denn umsetzen?

    Code:
    static inline int32_t read_32bitBE(off_t offset, STREAMFILE * streamfile) {
        uint8_t buf[4];
    
        if (read_streamfile(buf,offset,4,streamfile)!=4) return -1;
        return get_32bitBE(buf);
    }
    
    <hier wurde diverses entfernt, weil ich denke das es nichts mit meiner Frage zu tun hat>
    
    int read_fmt(int big_endian,
        STREAMFILE * streamFile, 
        off_t current_chunk,
        struct riff_fmt_chunk * fmt,
        int sns,
        int mwv) {
    
        int32_t (*read_32bit)(off_t,STREAMFILE*) = NULL;
        if (big_endian) {
            read_32bit = read_32bitBE;
            read_16bit = read_16bitBE;
        } else {
            read_32bit = read_32bitLE;
            read_16bit = read_16bitLE;
        }
    
        fmt->offset = current_chunk;
        fmt->size = read_32bit(current_chunk+0x4,streamFile);
    
    <hier wurde diverses entfernt, weil ich denke das es nichts mit meiner Frage zu tun hat>
    
    
    }
    Wenn big_endian gesetzt ist, dann führt der read_32bit immer den read_32bitBE aus, wenn nicht dann den read_32bitLE.

    Gruß Womble

  • #2
    Die Aufgabe in umgangssprachlich wäre einfacher

    Ich probiers mal:
    Du möchtest an einen bestimmten Offset 4 Byte aus einem File lesen und das als Int32 zurückgeben und dabei die 4 Byte als BigEndian annehmen?

    Comment


    • #3
      Danke für die schnelle Antwort, aber nein, dann versuche ich es ausführlich.

      Ich habe in einem C++ Programm eine Routine gesehen die über den gleichen Namen "read_32bit", je nach Anforderung entweder die "read_32bitBE" oder die "read_32bitLE" ruft.
      Im C++ Programm wird quasi zu Beginn festgelegt ich brauche "read_32bitBE" oder "read_32bitLE" und danach wird immer nur die "read_32bit" gerufen, die dann entsprechend auf die aktuell benötigte Routine zugreift.

      In meinem Programm habe ich das im Moment so gelöst, was nicht unbedingt schön lesbar ist.

      Format.Size = (big_endian ? read_32bitBE(current_chunk+0x4, streamfile) : read_32bitLE(current_chunk+0x4, streamfile));

      Ich hoffe so ist besser zu verstehen was ich möchte.

      Gruß Womble

      Comment


      • #4
        Hat sich erledigt.

        Es läuft über die Delegaten, und wenn man es richtig macht funktioniert es auch

        [highlight=c#]
        delegate UInt16 ReadWord(byte[] bytes, int Offset);

        static public UInt16 LEWord16(byte[] bytes, int Offset)
        {
        return (UInt16)(bytes[Offset] + bytes[Offset + 1] * 256);
        }
        static public UInt16 BEWord16(byte[] bytes, int Offset)
        {
        return (UInt16)(bytes[Offset] * 256 + bytes[Offset + 1]);
        }

        ... und an meiner Problemstelle dann

        ReadWord Read16 = null;

        if(big_endian)
        Read16 = BEWord16;
        else
        Read16 = LEWord16;

        Format.Codec = Read16(current_chunk, streamfile);
        [/highlight]

        Gruß Womble
        Zuletzt editiert von Womble; 17.04.2015, 11:00.

        Comment

        Working...
        X