검사를 위해 SD 카드의 원시 콘텐츠를 파일로 덤프하고 싶습니다. 대부분은 0입니다. ~으로부터 배우다이 슈퍼유저 답변pv
and의 진행 상황을 표시하는 데 사용할 수 있습니다 . 예상 도착 시간은 모두 1시간 30분입니다.od
hexdump
# pv /dev/sdd | od -x --endian=big > sdd_file
... ... ... [> ] ... ETA 1:34:42
그리고
# pv /dev/sdd | hexdump -C > sdd_file
... ... ... [> ] ... ETA 1:35:01
하지만 xxd
11시간이 걸립니다.
# pv /dev/sdd | xxd -a -u > sdd_file
... ... ... [> ] ... ETA 10:48:53
나는 주로 가능성 xxd
때문에 그것을 선호합니다. -revert
하지만 xxd
디스크를 처리하는 데 시간이 오래 걸립니다. 파일이 전달될 수 있도록 동일한 형식으로 파일을 포맷 hexdump
(또는 생성)하려면 어떻게 해야 합니까 ?od
xxd
-reverted
xxd
답변1
어떤 사람들은 말한다 xxd -r
또한 hexdump
출력을 입력으로 받아들입니다. 하지만 테스트해 보니 그렇지 않았습니다. 또한 파일이 백업으로도 사용되는 경우에는 보다 보장된(즉, 원본과 정확히 동일한) 형식을 사용하는 것이 좋습니다.
영감을 주셔서 감사합니다이 답변포맷하는 방법을 배웠습니다 hexdump
.
핵심요약 - 솔루션
pv /dev/sdd | hexdump -e '"%08.8_ax: "' -e '2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " "' -e '" " 16/1 "%_p" "\n"' > sdd_file
몇 가지 수정 작업을 수행했습니다.
주의하시기 바랍니다. - 디스크가 대부분 0으로 되어 있는 경우 이러한 방법은 압축과 유사하게 매우 작은 파일을 생성합니다. 그렇지 않으면 출력 파일은 디스크 크기의 약 4배가 됩니다. 드라이브에 여유 공간이 충분하다는 점에 유의하세요.
시험을 받다
파일 준비.
# echo '- - - - Create a really large file of zeroes - - - -'
# dd bs=1100000000 count=4 if=/dev/zero of=test
4+0 records in
4+0 records out
4400000000 bytes (4.4 GB, 4.1 GiB) copied, 8.71123 s, 505 MB/s
# echo '- - - - Overwrite it with some letters in the beginning (without \n) - - - -'
# echo -n "ABCD xyz" > letters
# dd if=letters of=test conv=notrunc
# echo '- - - - Append some letters in the end (with \n) - - - -'
# echo "ABCD xyz" >> test
무엇을 출력할 것인가 xxd -a -u
?
# pv test | xxd -a -u > test_xxd
4.10GiB 0:05:39 [12.3MiB/s] [====================================================>] 100%
# cat test_xxd
00000000: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
10642ac00: 4142 4344 2078 797A 0A ABCD xyz.
(내 솔루션) 출력을 시뮬레이션하는 방법 hexdump ...
.
# pv test | hexdump -e '"%08.8_ax: "' -e '2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " "' -e '" " 16/1 "%_p" "\n"' > test_hexdump
4.10GiB 0:00:29 [ 144MiB/s] [====================================================>] 100%
# cat test_hexdump
00000000: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
10642ac00: 4142 4344 2078 797A 0A ABCD xyz.
그것들을 비교하십시오.
# diff -s test_xxd test_hexdump
Files test_xxd and test_hexdump are identical
설명하다
형식 구문이 잘 작성되었습니다.hexdump
매뉴얼 페이지.
A format string contains any number of format units, separated by
whitespace. A format unit contains up to three items: an
iteration count, a byte count, and a format.
The iteration count is an optional positive integer, which
defaults to one. Each format is applied iteration count times.
The byte count is an optional positive integer. If specified it
defines the number of bytes to be interpreted by each iteration
of the format.
If an iteration count and/or a byte count is specified, a single
slash must be placed after the iteration count and/or before the
byte count to disambiguate them. Any whitespace before or after
the slash is ignored.
내 솔루션은 세 가지 형식 문자열로 구성되며 모두 뒤에 -e
옵션이 있습니다.
-e '"%08.8_ax: "'
매뉴얼 페이지에 언급된 대로 형식 단위는 입니다 { { iteration_count:1 / } byte_count } format
. 이 경우 반복 횟수와 바이트 수가 모두 생략됩니다. _a
형식으로 오프셋 바이트를 인쇄합니다 x
. %08.8
이는 8자를 필요로 하며 앞에 0이 붙는다는 의미입니다. (실제로 %08_ax
작동합니다.)
-e '2/1 "%02X" " " ... ... ... ... ... '
두 번째 형식 문자열은 형식 셀을 2/1 "%02X" " "
8번 반복한 것입니다. 열은 8개입니다. 2/1
이는 1바이트가 두 번 소비된다는 의미입니다. 이렇게 하면 출력 16진수가 빅엔디안 형식이 됩니다. 2바이트를 소비하여 16진수로 변환하면 오른쪽 바이트가 최상위 바이트(#1)로 간주됩니다. 우리의 번호 매기기 시스템과 직관적인 인식과는 달리 출력이 바뀌어 표시됩니다.
이 형식은 대문자 HE , 문자 너비, 왼쪽 패딩 "%02X"
으로 표시한다는 의미입니다 .X
2
0
" "
실제로 반복 횟수와 바이트 수가 생략된 또 다른 형식 단위입니다. 2바이트마다 공백을 추가합니다.
그런 다음 이 형식 셀 세트가 8번 반복되어 8개의 열을 인쇄합니다.
#1 - hexdump
기본적으로 CPU의 바이트 순서를 사용합니다(인용하다), 여기서 x86/x64 CPU는 16비트 크기 단어와 함께 리틀 엔디안 바이트 순서를 사용합니다.
-e '" " 16/1 "%_p" "\n"'
마지막으로 세 번째 형식 문자열은 공백으로만 시작됩니다 " "
. 그 다음에는 형식 단위가 옵니다 16/1 "%_p"
. 다시 말하지만, 1
한 번에 1바이트를 소비하고 여러 번 반복합니다 16
. 일반적으로 기본적 으로 수행되는 %_p
것처럼 기본 문자 세트에서 문자를 출력합니다 . 형식 문자열의 세 번째 형식 단위는 개행 문자만 출력합니다.hexdump -C
xxd
\n
우리에게 불리한 상황이 닥쳤을 때
우리가 해결해야 할 두 가지 사항이 있습니다.
TL;DR - (1) 필요한 경우 마지막 줄을 다시 추가하세요. (2) 공백이 아닌 중복된 줄을 다시 추가합니다.
줄 건너뛰기 알고리즘 간의 차이점을 관찰하세요.
# xxd -a -u test
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000030: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00000070: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000080: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000090: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
# hexdump -C test
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000020 41 42 43 44 20 78 79 7a 00 00 00 00 00 00 00 00 |ABCD xyz........|
*
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000070 41 42 43 44 20 78 79 7a 00 00 00 00 00 00 00 00 |ABCD xyz........|
*
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000000d0
xxd
xxd
항상 마지막 줄을 인쇄하세요. 마지막 행은 중복 행 고려 사항에 포함되지 않습니다.- ~을 위한3개 이상연속된 줄을 건너뛰고 빈 줄을 반복합니다
xxd
. - 복원 시
xxd
빈 줄에는 별표(*)만 복원됩니다.xxd
별표는 공백이 아닌 중복된 줄로 처리되지 않습니다. 이는xxd
비어 있지 않은 줄은 애초에 건너뛰지 않기 때문입니다 . - 규칙 (2)에서도 두 개의 연속된 빈 줄이 있으면
xxd
둘 다 건너뛰지 않습니다. 그러나 복원 시xxd
빈 줄로만 복원하려면 물음표를 수락합니다.xxd
아주 잘 처리되었습니다.(이것은 나중에 증명하겠습니다.)
hexdump
hexdump
항상 인쇄한 줄 더기본 형식을 사용하는 파일의 바이트 수입니다. 그렇기 때문에hexdump
마지막 행이 중복 행인 경우 건너뛸 수 있습니다.- ~을 위한둘 이상연속된 줄을 건너뛰고 비어 있거나 비어 있지 않은 줄을 반복합니다
hexdump
.
우리 솔루션 시연.
# pv test | hexdump -e '"%08.8_ax: "' -e '2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " " 2/1 "%02X" " "' -e '" " 16/1 "%_p" "\n"' > output
208 B 0:00:00 [1.00MiB/s] [==================================>] 100%
# cat output
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00000020: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
*
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00000070: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
*
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
두 가지 수정 사항.
- 마지막 줄에 별표가 있으면 마지막 줄을 건너뛴다는 뜻입니다
hexdump
. 파일(또는 디스크) 크기에서 16바이트(예: 0x10)를 뺀 바이트 오프셋을 계산해야 합니다. 마지막 줄을 다시 추가하거나 별표를 마지막 줄로 바꾸세요. - 별표 앞의 줄이 빈 줄이 아닌 경우, 비어
hexdump
있지 않은 줄을 건너뛰는 것을 의미합니다. 비어 있지 않은 중복 행을 다시 추가해야 합니다. - 마지막 줄을 추가할 때 공백 또는 공백이 아닌 줄이 필요할 수 있습니다.
디스크 크기를 찾으려면 lsblk -b
.
수리 후.
# vi output
# cat output
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00000020: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000030: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00000070: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000080: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
00000090: 4142 4344 2078 797A 0000 0000 0000 0000 ABCD xyz........
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
복구하고 확인하세요.
# xxd -r output restore
# diff -s test restore
Files test and restore are identical
주의하시기 바랍니다. 줄 00000010:
과 줄 에서 000000b0
별표로 대체된 단일 빈 줄은 잘 작동합니다 xxd -revert
.
답변2
다음을 간단히 사용할 수 있습니다.
원하는 형식으로 16진수 덤프를 가져옵니다.
hexdump -Cv <바이너리 파일.bin> > 바이너리 파일.txt
-C는 데이터를 바이트 단위로 인쇄합니다.
-v는 *를 사용하여 중복된 내용을 나타내지 않습니다.
이제 bin_file.txt의 각 줄에서 첫 번째와 마지막 문자를 제거해야 합니다. 여기서 sed 명령을 사용할 수 있습니다.
이제 xxd 명령을 사용하십시오
xxd -r -p 바이너리.txt > 바이너리.bin 복원
두 파일의 md5sum을 확인할 수 있습니다. 그것은 일치해야
md5sum 바이너리 파일.bin
md5sum 복원 바이너리 파일 .bin