xxd에는 64비트 주소가 있습니다.

xxd에는 64비트 주소가 있습니다.

나는 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

xxdlongs를 주소로 사용 하되 명시적으로 32비트로 자릅니다.이 문제를 해결할 방법은 없는 것 같습니다. 그건vim 문제 #3791(신고해 주셔서 감사합니다),이제 패치 8.1.0854에서 수정되었습니다..

그러나 입력( 사용)에는 제한이 없는 것으로 보이 -r므로 표준을 사용하여 od16진수 덤프를 인쇄할 수 있습니다.

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

그러나 odGNU를 포함한 여러 구현은 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않지만 언제든지 출력을 사후 처리하여 주소 필드에 오프셋을 추가할 수 있습니다. 예를 들면 다음과 같습니다.hexdumpxxd-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

xxd0 오프셋을 사용하고 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

답변2

문제를 해결하는 패치가 이제 공식적으로 vim에 패치로 포함되었습니다.854화. 따라서 패치가 포함된 새 버전의 vim(v8.1.0854+)으로 업데이트하거나 다음에서 시작하세요.원천아직 초대하지 않았다면 직접 초대하세요.

관련 정보