나는 xxd가 터미널에서 바이너리 데이터를 간단하게 조작하는 데 매우 훌륭하고 편리하다고 생각합니다. 그러나 프로그램에 의해 출력되는 모든 주소는 32비트로 제한된다는 제한이 있습니다. 예를 들어
root:/# xxd -s 0x5baae0000 /dev/sda
baae0000: 2d7c 6176 6976 6172 7c61 7469 7a61 720a -|avivar|atizar.
처음 5개가 누락되었습니다. 즉, 직접 사용하면 xxd -r
생각보다 빨리 100억 바이트 영역을 초과하게 된다는 뜻이다. 즉, 나는 이것을 하고 싶다.
root:/# echo HELLO | xxd -o 0x5baae0000 | xxd -r - /dev/sdb
하지만 결국 이런 식으로 문제를 해결해야했습니다.
root:/# echo HELLO | xxd -o 0x5baae0000 | xxd -r -seek 0x500000000 - /dev/sdb
패치를 구문 분석할 때 누락된 0x5000000바이트 오프셋을 대상 파일에 다시 추가합니다.
어쨌든, xxd가 64비트 주소를 사용하도록 하는 알려지지 않은/영리한 방법이 있는지, 아니면 xxd처럼 실행되지만 이러한 제한이 없는 대안이 있는지 궁금합니다.
답변1
xxd
long
s를 주소로 사용 하되 명시적으로 32비트로 자릅니다.이 문제를 해결할 방법은 없는 것 같습니다. 그건vim 문제 #3791(신고해 주셔서 감사합니다),이제 패치 8.1.0854에서 수정되었습니다..
그러나 입력( 사용)에는 제한이 없는 것으로 보이 -r
므로 표준을 사용하여 od
16진수 덤프를 인쇄할 수 있습니다.
od -j 0x5baae0000 -Ax -vtx1 -N16 /dev/sda
그러면 다음과 같이 출력됩니다.
5baae0000 2d 7c 61 76 69 76 61 72 7c 61 74 69 7a 61 72 0a
5baae0010
그러나 od
GNU를 포함한 여러 구현은 od
그렇지 않습니다.찾다지정된 오프셋에 도달 -j
하지만 모든 데이터를 읽고 건너뛰므로 귀하의 경우와 같은 대형 블록 장치에는 실용적이지 않습니다.
또는 ASCII 측면에 관심이 있다면 BSD hexdump
를 사용하십시오.
$ hexdump -ve '"%_ax:" 16/1 " %02x"' -e '" " 16 "%_p" "\n"' -s 0x5baae0000 -n 16 /dev/sda
5baae0000: 2d 7c 61 76 69 76 61 72 7c 61 74 69 7a 61 72 0a -|avivar|atizar
둘 다 먹일 수 있음xxd -r
xxd
다음 명령을 사용하면 실제로 출력 형식(32비트 주소 제한 없이)을 재현할 수 있습니다 hexdump
.
hexdump -ve '"%08_ax: " 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"'
주소를 오프셋하는 것과 동등한 기능 도 지원되지 od
않지만 언제든지 출력을 사후 처리하여 주소 필드에 오프셋을 추가할 수 있습니다. 예를 들면 다음과 같습니다.hexdump
xxd
-o
perl -pe 's/^\w+/sprintf "%08x", 0xabcdef + hex$&/e'
어쨌든 파일의 특정 오프셋에 데이터를 쓰려면 다음을 xxd
사용할 수 있습니다 dd
.
echo HELLO | dd bs=1 seek="$((0x5baae0000))" of=/dev/sda
또는 ksh93
>#((...))
운송업체를 찾으세요.
echo HELLO 1<> /dev/sda >#((0x5baae0000))
또는 내장 zsh
되어 sysseek
있습니다:
zmodload zsh/system
{
sysseek -u 1 $((0x5baae0000)) &&
echo HELLO
} 1<> /dev/sda
xxd
0 오프셋을 사용하고 dd/ksh93/zsh를 사용하여 수행할 수도 있습니다.구하다:
echo HELLO | xxd | { sysseek -u 1 $((0x5baae0000)) && xxd -r; } 1<> /dev/sda
또는:
echo HELLO | xxd | { dd bs=1 seek="$((0x5baae0000))" count=0 && xxd -r; } 1<> /dev/sda
¹보고있다원천, GNU는 파일 끝까지 검색하는 것을 피하기 위해 (대신) 입력 크기를 가져오는 데 od
사용합니다 . 이는 블록 장치의 크기를 반영하지 않는 Linux와 같은 시스템의 블록 장치에서는 작동하지 않습니다.fstat()
lseek(SEEK_END)
st_size