2진수에서 16진수로 변환하거나 그 반대로 변환

2진수에서 16진수로 변환하거나 그 반대로 변환

바이너리 파일이 주어지면 및 같은 표준 도구 만 사용하여 최소 설치된 시스템에서 어떻게 sed이를 16진수 문자열로 변환하고 다시 되돌릴 수 있습니까 ?cutbusybox

이러한 도구는아니요쓸 수 있는:

  • perl
  • python
  • xxd(vim과 함께 제공)
  • gcc

hexdump명령과 함께 제공되지만 busybox함께 제공되는 명령과는 다릅니다 util-linux.

파일을 16진수 문자열로 변환하는 스크립트 또는 명령과 이를 다시 바이너리로 변환하는 해당 스크립트 또는 명령을 찾고 있습니다. 중간 형식은 16진수일 필요는 없으며 base64 또는 기타 형식일 수 있습니다.

이는 디스크 공간이 제한된 임베디드 장치에 적합합니다.

답변1

다음은 제가 생각해낸 것입니다(몇 가지 온라인 리소스와 몇 가지 실험을 기반으로 함).

16진수에서 2진수( )로 변환 hex2bin:

#!/bin/sh
sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' "$1" | xargs printf

bin을 16진수( bin2hex)로 변환:

#!/bin/sh
hexdump -v -e '1/1 "%02x"' "$1"

사용 예:

./bin2hex binary_file_1 | ./hex2bin - > binary_file_2
diff -s binary_file_1 binary_file_2

이는 busybox에서 작동하지만 불행하게도 hex2bin은 주어진 매개변수의 최대 길이로 제한되므로 xargs이 방법은 작은 파일(데스크톱 시스템에서 32KiB 미만)에만 작동합니다.

답변2

POSIXly(그리고 호환 가능한 공통 하위 집합만 사용 busybox(또는 적어도 busybox현재 데비안 패키지용으로 busybox구축 )):

  • bin2hex:

    (
      export LC_ALL=C
        od -An -vtx1 |
        tr -s ' \t\n' '\n\n\n' |
        grep .
    )
    

    (한 줄에 하나의 16진수)

  • hex2bin:

    (
      export LC_ALL=C
        awk '
          BEGIN{
            for (i = 0; i < 256; i++)
              c[sprintf("%02x", i)] = sprintf("%o", i)
          }
          NR % 200 == 1 {printf "%s", end "printf '\''"; end = "'\''\n"}
          {printf "\\%s", c[$0]}
          END {print end}' |
        sh
    )
    

busybox데비안과 달리 당신의 것이 없다면데스크탑옵션을 선택하면 -An-tx1옵션을 od사용할 수 없습니다. 대신 이를 사용하면 od -b8진수 오프셋이 있는 1바이트 8진수 덤프를 제공할 수 있습니다. od -bUnix이지만 POSIX는 아니므로 모든 Unix 계열 시스템에서는 작동하지 않습니다.

bin2hex될 것입니다:

(
  export LC_ALL=C
    od -b |
    awk '
      BEGIN{
        for(i = 0; i < 256; i++)
          hex[sprintf("%03o", i)] = sprintf("%02x", i)
      }
      NF > 1 {for (i = 2; i<= NF; i++) print hex[$i]}'
)

다시 말하지만, 데비안의 비지박스로만 테스트한 결과, 이것이 busybox컴파일 타임 옵션이나 기타 사항에 얼마나 의존하는지 알 수 없습니다. 대상 시스템에서 테스트해야 합니다.

답변3

귀하의 busybox는 작은 프로그램으로 구축될 수 있습니다64비트 기반그래서 당신은 할 수 있습니다

busybox base64 <bin >txt
busybox base64 -d <txt >bin

아니면 그렇지 않다면 존경할 만한 사람이 있을 수도 있습니다.유 인코딩그리고우드 코드, 선택적으로 -m16진수로 인코딩됩니다. 예를 들어

echo -n abcABC | busybox uuencode -m - | busybox uudecode - 

함께 제공되는 내장 애플릿을 나열합니다 busybox --list.

관련 정보