마지막 구문

안녕하세요. 이 문제를 풀다가 마지막 구문이 이해가 되지 않아서 이렇게 질문을 남깁니다.
password += int.to_bytes(int(bits, 2), (bit_length + 7) // 8, "big").decode("utf-8")
(1) 구글링을 해보면 int.to_bytes(길이, order, 2의 보수) 이런식으로 쓴다고 나와있는데, 여기서는 어떻게 사용하는 건지 궁금합니다.

(2) 야매로 제가 끼워 맞추어보았을때, (bit_length+7)//8을 하는이유가, 총 7비트가 1개의 블록이라고 앞에서 배웠는데, 이를 나눠주기 위해 사용하는건가요?
(3) 그리고 또한 만약 이렇게 계산한다면, decode utf8을 할때 한번에 이루어지나요? 아니면 따로 따로 이루어지나요?

열심히 공부해보겠습니다..ㅜ

#web
작성자 정보
답변 1
avatar
연주
2023 Christmas CTF 참여

안녕하세요!

  1. to_bytes 메서드를 object로 호출할 땐 object.to_bytes(길이, 바이트오더)이고, class로 호출할 땐 int.to_bytes(정수, 길이, 바이트오더)로 쓸 수 있습니다.
>>> (111111111).to_bytes(4, 'little')
b'\xc7k\x9f\x06'
>>> int.to_bytes(111111111, 4, 'little')
b'\xc7k\x9f\x06'
  1. bit_length에 따라 1~8 -> 1, 9~16 -> 2, 17~24 -> 3으로 계산됩니다. 즉, 해당 bitstring이 나타내는 정수를 담는 데에 필요한 최소의 바이트 개수를 구하는 공식입니다.

  2. (솔직히 말해서 질문을 잘 이해하지 못했습니다) utf-8은 가변 길이 인코딩이라서 1바이트든 3바이트든 인코딩 형식에 맞으면 한 번에 변환됩니다.

2023.02.10. 02:02
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기