Bitweises XOR von Hex-Zahlen in Python

Salman Mehmood 21 Juni 2023
Bitweises XOR von Hex-Zahlen in Python

Das Hauptziel dieses Artikels ist es zu demonstrieren, wie man mit XOR-Zahlen in einem hexadezimalen Zahlensystem in Python arbeitet.

Bitweises XOR von Hex-Zahlen in Python

XOR ist ein bitweiser Operator, was Exklusiv-ODER bedeutet. Es führt die logische Operation durch, bei der, wenn beide Eingaben (entweder 0 oder 1) gleich sind, 1 zurückgegeben wird; andernfalls, wenn die Eingabezahlen unterschiedlich sind (wie 0 und 1 oder 1 und 0), dann ist die Ausgabe 0.

XOR wird normalerweise in Anwendungen verwendet, die für Komprimierung, Verschlüsselung, Grafik oder Kommunikation in irgendeiner Form verwendet werden. Als Teil der logischen Bitwise-Operatoren ermöglicht XOR eine höhere Genauigkeit und erfordert weniger Ressourcen, wodurch der Code viel schneller und effizienter wird.

Mit dem Operator ^ ist es ziemlich einfach, Dezimalzahlen mit XOR zu verknüpfen. Was ist mit Zahlen, die ursprünglich in oder Teil einer Zeichenfolge sind?

Betrachten Sie den folgenden Code:

def strxor(a, b):
    if len(a) > len(b):
        return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a[: len(b)], b)])
    else:
        return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a, b[: len(a)])])


if __name__ == "__main__":

    print("1C2 ^ ABC = ", strxor("1C2", "ABC"))
    print("2FF ^ 78B = ", strxor("2FF", "78B"))
    print("29A ^ 90C = ", strxor("29A", "90C"))
    print("10C ^ 24B = ", strxor("10C", "24B"))
    print("BAD ^ 432 = ", strxor("BAD", "432"))
    print("54F ^ 123 = ", strxor("54F", "123"))

Dies ergibt die folgende Ausgabe:

1C2 ^ ABC =  1121113
2FF ^ 78B =  51264
29A ^ 90C =  1192
10C ^ 24B =  341
BAD ^ 432 =  118114118
54F ^ 123 =  46117

Lassen Sie uns unsere Lösung überprüfen:

if __name__ == "__main__":

    print("1C2 ^ 0xABC = ", 0x1C2 ^ 0xABC)
    print("2FF ^ 0x78B = ", 0x2FF ^ 0x78B)
    print("29A ^ 0x90C = ", 0x29A ^ 0x90C)
    print("10C ^ 0x24B = ", 0x10C ^ 0x24B)
    print("BAD ^ 0x432 = ", 0xBAD ^ 0x432)
    print("54F ^ 0x123 = ", 0x54F ^ 0x123)

Dies ergibt die folgende Ausgabe:

1C2 ^ 0xABC =  2942
2FF ^ 0x78B =  1396
29A ^ 0x90C =  2966
10C ^ 0x24B =  839
BAD ^ 0x432 =  3999
54F ^ 0x123 =  1132

Wie aus dem obigen Code ersichtlich, haben wir eine neue Methode namens strxor erstellt, die zwei Parameter namens a und b entgegennimmt, die den beiden an die Funktion übergebenen Strings entsprechen. Das Ziel der Methode besteht darin, zwei Zeichenfolgen zu nehmen, sie zu XORen und das Ergebnis (das ebenfalls eine Zeichenfolge ist) zurückzugeben.

Bei der Überprüfung der Lösung ist ersichtlich, dass das Ergebnis anders ist als erwartet. Mit anderen Worten, die implementierte Funktion strxor hat einen logischen Fehler.

Die Lösung dieses Problems kann auf mehrere Arten angegangen werden. Einige davon sind wie folgt definiert:

Lösung 1

def strxor(a, b):
    if len(a) > len(b):
        res = "".join(
            ["%x" % (int(x, 16) ^ int(y, 16)) for (x, y) in zip(a[: len(b)], b)]
        )
        return int("0x" + res, 0)
    else:
        res = "".join(
            ["%x" % (int(x, 16) ^ int(y, 16)) for (x, y) in zip(a, b[: len(a)])]
        )
        return int("0x" + res, 0)

Dies ergibt die folgende Ausgabe:

1C2 ^ ABC =  2942
2FF ^ 78B =  1396
29A ^ 90C =  2966
10C ^ 24B =  839
BAD ^ 432 =  3999
54F ^ 123 =  1132

In der oben erwähnten Lösung wurden Korrekturen an der ursprünglichen Funktion vorgenommen, um die korrekte Ausgabe anzuzeigen, wenn überprüft wird, was im Code geändert wurde, anstatt ord() zu verwenden, das die Zahl zurückgibt, die den Unicode-Code eines bestimmten Zeichens darstellt.

Wir verwenden int, wobei die Parameter einer der Strings und eine 16 sind, was sich auf die Basis der Zahl bezieht, die hex entspricht.

Lösung 2

def strxor(a, b):
    if len(a) > len(b):
        res = "%x" % (int(a[: len(b)], 16) ^ int(b, 16))
        return int("0x" + res, 0)

    else:
        res = "%x" % (int(a, 16) ^ int(b[: len(a)], 16))
        return int("0x" + res, 0)

Dies ergibt die folgende Ausgabe:

1C2 ^ ABC =  2942
2FF ^ 78B =  1396
29A ^ 90C =  2966
10C ^ 24B =  839
BAD ^ 432 =  3999
54F ^ 123 =  1132

Diese Methode ist nicht auf for-Schleifen und zip angewiesen. Es ist viel schneller als sein Gegenstück in Bezug auf Laufzeit und Gesamtausführungszeit.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Verwandter Artikel - Python Hex