Frage

In der Dokumentation von Hardware, die wir es über UDP / IP zu steuern, Ich fand das folgende Fragment:

  

In diesem Kommunikationsprotokoll, DWORD ist ein 4-Byte-Daten, WORD ein 2-Byte-Daten sind,   BYTE ist ein einziges Byte Daten. Das Speicherformat ist little endian, nämlich 4 Bytes (32 Bits) Daten, wie gespeichert sind: d7-d0, d15-d8, d23-d16, d31-d24; Doppel Bytes (16 Bit) Daten gespeichert sind, wie:. d7-d0, d15-d8

Ich frage mich, wie dies zu C # übersetzt? Muss ich Sachen umwandeln, bevor es über das Senden? Zum Beispiel, wenn ich eine 32-Bit-Integer senden über, oder eine 4 Zeichenfolge?

War es hilfreich?

Lösung

C # selbst definieren nicht die Endian. Jedes Mal, wenn Sie in Bytes konvertieren, aber du machst eine Wahl. Die BitConverter Klasse hat eine MiscUtil Bibliothek hat eine EndianBitConverter Klasse, die Sie endianness definieren können; gibt es ähnliche Mittel für Binary / Writer. Keine Online-Nutzung Guide Ich habe Angst, aber sie sind trivial:)

(EndianBitConverter hat auch einen Teil der Funktionalität, die nicht in dem normalen BitConverter ist, die Umsetzungen in-place in einem Byte-Array zu tun.)

Andere Tipps

Sie können auch verwenden

IPAddress.NetworkToHostOrder(...)

Für kurze, int oder lang.

Re Little-Endian, die kurze Antwort (zu tun, brauche ich nichts zu tun) ist „wahrscheinlich nicht, aber es hängt von Ihrer Hardware“. Sie können mit überprüfen:

bool le = BitConverter.IsLittleEndian;

Je nachdem, was dieser sagt, möchten Sie vielleicht Teile Ihrer Puffer umkehren. Alternativ Jon Skeet hat spezifische Endian-Wandler hier (suchen Sie nach EndianBitConverter).

Beachten Sie, dass Itaniums (zum Beispiel) sind Big-Endian. Die meisten sind Intels Little-Endian.

Re die spezifischen UDP / IP ...?

Ich spiele um mit gepackten Daten in UDP-Multicast und ich brauchte etwas UInt16 Bytes neu zu ordnen, da ich einen Fehler im Paket-Header (Wireshark) bemerkt, also machte ich diese:

    private UInt16 swapOctetsUInt16(UInt16 toSwap)
    {
        Int32 tmp = 0;
        tmp = toSwap >> 8;
        tmp = tmp | ((toSwap & 0xff) << 8);
        return (UInt16) tmp;
    }

Bei UInt32,

    private UInt32 swapOctetsUInt32(UInt32 toSwap)
    {
        UInt32 tmp = 0;
        tmp = toSwap >> 24;
        tmp = tmp | ((toSwap & 0xff0000) >> 8);
        tmp = tmp | ((toSwap & 0xff00) << 8);
        tmp = tmp | ((toSwap & 0xff) << 24);
        return tmp;
    }

Dies ist nur zum Testen

    private void testSwap() {
        UInt16 tmp1 = 0x0a0b;
        UInt32 tmp2 = 0x0a0b0c0d;
        SoapHexBinary shb1 = new SoapHexBinary(BitConverter.GetBytes(tmp1));
        SoapHexBinary shb2 = new SoapHexBinary(BitConverter.GetBytes(swapOctetsUInt16(tmp1)));
        Debug.WriteLine("{0}", shb1.ToString());
        Debug.WriteLine("{0}", shb2.ToString());
        SoapHexBinary shb3 = new SoapHexBinary(BitConverter.GetBytes(tmp2));
        SoapHexBinary shb4 = new SoapHexBinary(BitConverter.GetBytes(swapOctetsUInt32(tmp2)));
        Debug.WriteLine("{0}", shb3.ToString());
        Debug.WriteLine("{0}", shb4.ToString());
    }

, von dem Ausgang war:

    0B0A: {0}
    0A0B: {0}
    0D0C0B0A: {0}
    0A0B0C0D: {0}
scroll top