Gibt es eine "Standard" -Htonl-ähnliche Funktion für 64-Bit-Ganzzahlen in C ++?

Ich arbeite an einer Implementierung des Memcache-Protokolls, das an einigen Stellen 64-Bit-Integer-Werte verwendet. Diese Werte müssen in "Netzwerkbyte-Reihenfolge" gespeichert werden.

Ich wünschte, es gäbe einigeuint64_t htonll(uint64_t value) Funktion, um die Änderung durchzuführen, aber leider konnte ich sie nicht finden, wenn sie existiert.

So habe ich 1 oder 2 Fragen:

Gibt es irgendwelchetragba (Windows, Linux, AIX) Standardfunktion, um dies zu tun?Wenn es keine solche Funktion gibt, wie würden Sie sie implementieren?

Ich habe eine Grundimplementierung im Sinn, weiß aber nicht, wie ich die Endianness beim Kompilieren überprüfen kann, um den Code portabel zu machen. Also eure Hilfe ist hier mehr als willkommen;)

Vielen Dank

Hier ist die endgültige Lösung, die ich dank Brians Lösung geschrieben habe.

uint64_t htonll(uint64_t value)
{
    // The answer is 42
    static const int num = 42;

    // Check the endianness
    if (*reinterpret_cast<const char*>(&num) == num)
    {
        const uint32_t high_part = htonl(static_cast<uint32_t>(value >> 32));
        const uint32_t low_part = htonl(static_cast<uint32_t>(value & 0xFFFFFFFFLL));

        return (static_cast<uint64_t>(low_part) << 32) | high_part;
    } else
    {
        return value;
    }
}

Antworten auf die Frage(12)

Ihre Antwort auf die Frage