Python에서 16진수의 비트별 XOR

Salman Mehmood 2023년6월21일
Python에서 16진수의 비트별 XOR

이 기사의 주요 목표는 Python의 16진수 시스템에서 XOR 숫자로 작업하는 방법을 보여주는 것입니다.

Python에서 16진수의 비트별 XOR

XOR은 배타적 OR을 의미하는 비트 연산자입니다. 두 입력(0 또는 1)이 같으면 1을 반환하는 논리 연산을 수행합니다. 그렇지 않고 입력 숫자가 다르면(예: 0과 1 또는 1과 0) 출력은 0이 됩니다.

XOR은 일반적으로 압축, 암호화, 그래픽 또는 모든 형식의 통신에 사용되는 응용 프로그램에서 사용됩니다. Bitwise 논리 연산자의 일부인 XOR은 더 높은 정밀도를 허용하고 더 적은 리소스를 필요로 하므로 코드를 훨씬 더 빠르고 효율적으로 만듭니다.

^ 연산자를 사용하면 십진수에서 숫자를 XOR하는 것이 매우 쉽습니다. 처음에 문자열에 있거나 문자열의 일부인 숫자는 어떻습니까?

다음 코드를 고려하십시오.

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"))

이것은 아래와 같은 출력을 제공합니다:

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

솔루션을 확인해 보겠습니다.

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)

이는 다음과 같은 결과를 제공합니다.

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

위의 코드에서 볼 수 있듯이 함수에 전달된 두 문자열에 해당하는 ab라는 두 개의 매개 변수를 사용하는 strxor라는 새 메서드를 만들었습니다. 이 메서드의 목적은 두 개의 문자열을 가져와서 XOR한 다음 결과(문자열이기도 함)를 반환하는 것입니다.

해결 방법을 확인한 결과 예상과 다른 결과가 나타납니다. 즉, 구현된 함수 strxor에 논리적 오류가 있습니다.

이 문제에 대한 해결책은 여러 가지 방법으로 접근할 수 있습니다. 이들 중 일부는 다음과 같이 정의됩니다.

솔루션 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)

이는 다음과 같은 결과를 제공합니다.

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

위에서 언급한 솔루션에서 지정된 문자의 유니코드 코드를 나타내는 숫자를 반환하는 ord()를 사용하는 대신 코드에서 변경된 내용을 검사할 때 올바른 출력을 표시하도록 원래 함수가 수정되었습니다.

문자열 중 하나인 매개변수와 16진수에 해당하는 숫자의 밑수를 참조하는 16과 함께 int를 사용합니다.

해결책 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)

이는 다음과 같은 결과를 제공합니다.

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

이 방법은 for 루프와 zip에 의존하지 않습니다. 런타임 및 전체 실행 시간과 관련하여 해당 제품보다 훨씬 빠릅니다.

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

관련 문장 - Python Hex