xxd -r -p는 무엇을 합니까?

xxd -r -p는 무엇을 합니까?

그래서 수신한 첨부 파일에 대한 SHA1 다이제스트를 계산하여(base64 인코딩) 다이제스트와 일치하도록 합니다. ChatGPT를 사용하여 아래 명령을 성공적으로 사용할 수 있었습니다. 그러나 나는 이 명령 xxd -r -p이 왜 필요한지 이해하지 못합니다 .

sha1sum foo | awk '{print $1}' | xxd -r -p | base64

내가 이해하지 못하는 두 가지가 있습니다.

  1. 이 옵션이 왜 -p필요한가요? 16진수 덤프의 바이너리 덤프를 수행하는 방법을 알고 있지만 xxd -r인쇄하지 않으면 -p아무 것도 인쇄되지 않으며 매뉴얼 페이지에는 stdout으로 인쇄해야 한다고 나와 있으며 이는 -p특정 출력 스타일에서만 작동합니다.
  2. SHA1 다이제스트를 전달하는 목적은 무엇입니까 xxd? 내 이해는 xxd본질적으로 16진수와 2진수 간에 데이터를 변환하는 것입니다. 하지만 을 사용하지 않고 위 명령을 실행하면 xxd -r -p다르고 일치하지 않는 출력이 표시됩니다. 나는 16진수 스타일/표현(SHA1 다이제스트의 형식)이 무엇인지 알고 있지만 이 맥락에서 "바이너리"가 무엇을 의미하는지 모를 수도 있습니다.

답변1

xxd -r p먼저, 우리가 다루고 있는 내용을 이해하기 위해 입력을 살펴보겠습니다 . 예는 다음과 같습니다.

echo boo | sha1sum | awk '{print $1}'
6132b58967cf1ebc05062492c17145e5ee9f82a8

이 줄은 다음의 SHA1 해시를 생성합니다.4개문자 boo와 그 후행 개행 문자.

xxd이제 이 명령을 조금 연구해 봅시다 . xxd의 매뉴얼 페이지(참고자료 참조)에서는 man xxdxxd -r명령이 에서 생성된 일반 16진수 덤프를 되돌린다고 설명합니다 xxd. 따라서 다음과 같은 파이프라인을 구축할 수 있습니다.

echo boo | xxd | xxd -r
boo

이제 다음 두 출력을 비교해 보세요.

echo boo | xxd
00000000: 626f 6f0a                                boo.

echo boo | xxd -p
626f6f0a

두 번째 출력을 바이너리로 반전하려면 다음이 -r필요합니다 -p.

echo boo | xxd -p | xxd -r -p
boo

공백이나 다른 형식 없이 16진수 바이트로 생성된 이 구조는 xxd -p의 출력과 정확히 일치하므로 sha1sum이 방법을 사용하여 이진수로 변환할 수 있습니다. 그런 다음 (결국!) 결과 바이너리를 전달하여 Base 64로 base64변환합니다 .

echo boo | sha1sum | awk '{print $1}' | xxd -r -p | base64
YTK1iWfPHrwFBiSSwXFF5e6fgqg=

관련 정보