바이너리 파일이 주어지면 및 같은 표준 도구 만 사용하여 최소 설치된 시스템에서 어떻게 sed
이를 16진수 문자열로 변환하고 다시 되돌릴 수 있습니까 ?cut
busybox
이러한 도구는아니요쓸 수 있는:
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 -b
8진수 오프셋이 있는 1바이트 8진수 덤프를 제공할 수 있습니다. od -b
Unix이지만 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
아니면 그렇지 않다면 존경할 만한 사람이 있을 수도 있습니다.유 인코딩그리고우드 코드, 선택적으로 -m
16진수로 인코딩됩니다. 예를 들어
echo -n abcABC | busybox uuencode -m - | busybox uudecode -
함께 제공되는 내장 애플릿을 나열합니다 busybox --list
.