# 1의 답변 편집

# 1의 답변 편집

텍스트 파일의 10진수 값 목록을 16진수 형식으로 변환해야 합니다. 예를 들어 test.txt에는 다음이 포함될 수 있습니다.

131072
196608
262144
327680
393216
...

출력은 16진수 값 목록이어야 합니다(앞에 0이 있는 8자리 16진수).

00020000
00030000
00040000
...

출력은 텍스트 파일로 인쇄됩니다. Python 또는 Linux 쉘 스크립트를 사용하여 이를 어떻게 달성할 수 있습니까?

편집 #1

80000000한 가지 추가 작업을 놓쳤습니다. 생성된 각 16진수 값에 16진수를 추가 해야 합니다 . (산술 덧셈, 생성된 16진수 값 목록에 적용됨)

답변1

printf다음을 사용하여 이 작업을 수행 할 수 있습니다 bash.

printf '%08x\n' $(< test.txt)

아니면 printf와 bc를 사용하세요...그냥...왜냐면?

printf '%08s\n' $(bc <<<"obase=16; $(< test.txt)")

출력을 텍스트 파일로 인쇄하려면 >다음과 같이 쉘 리디렉션을 사용하면 됩니다.

printf '%08x\n' $(< test.txt) > output.txt

답변2

사용 awk:

$ awk '/[0-9]/ { printf("%08x\n", $0) }' file
00020000
00030000
00040000
00050000
00060000

답변3

세 가지 가능한 솔루션(각 행이 다음의 집합이라고 가정)오직숫자):

ksh, bash, zsh와 같은 셸의 경우:

printf '%08x\n' $(<infile)

bash에서만 작동합니다

<file.txt mapfile -t arr;   printf '%08x\n' "${arr[@]}" 

더 간단한 쉘의 경우: dash(Debian 기반 시스템의 기본 sh), ash(busybox 에뮬레이트 쉘), yash 및 AIX 및 Solaris의 일부 기본 쉘:

printf '%08x\n' $(cat infile)

사실, Heirloom 버전(Bourne과 유사)과 같은 쉘의 경우 다음과 같이 작성해야 합니다(위에 나열된 모든 posix 쉘에서 작동하지만 강력히 권장합니다)사용하지 마세요):

$ printf '%08x\n' `cat infile`

# 1의 답변 편집

16진수 값을 이해하면 8000000032비트 시스템에서 오버플로가 발생합니다(현재는 흔하지 않지만 가능함). 음수 값을 인쇄하지 않으려면 선택하십시오 echo "$((0x80000000))".

$ for i in $(<infile); do printf '%08x\n' "$(($i+0x80000000))"; done
80020000
80030000
80040000
80050000
80060000

답변4

줄리아를 사용하세요

$ julia -e 'function hexadd(x) hex(( x + 0x80000000),8) end ; output = open("output.txt","w") ; open("test.txt") do inputfile for num in eachline(inputfile) write(output,"$(hexadd(parse(Int,num)))\n") end end'

여러 줄을 읽는 것이 더 쉬워집니다.

function hexadd(x)
    hex(( x + 0x80000000),8)
end
output = open("output.txt","w")
open("test.txt") do inputfile
    for num in eachline(inputfile)
        write(output,"$(hexadd(parse(Int,num)))\n")
    end
end
  • hex( value, pad)값을 16진수로 변환하고 필요한 경우 패딩을 추가합니다.
    hexadd입력으로 정수가 필요하므로 문자열( 의 출력 eachline) 을 Intwith 로 변환하여 parse(Int,"string")함수에서 사용합니다.
  • julia -e표현식을 평가합니다.
  • Julia는 Fedora 및 Ubuntu에 기본적으로 설치할 수 있습니다.

직류 사용:

$ dc -f test.txt -e '16o16i[80000000+psaz1<r]dsrx80000000+p' > output.txt

설명하다:

  • dc -f test.txt -e '16o 16i [80000000 + p sa z 1 <r] sr z 1 <r 80000000 + p' > output.txt
  • -f file파일의 내용을 스택에 푸시합니다.
  • -e표현식 실행
  • 16o출력을 16진수로 변환
  • 16i입력이 16진수라고 가정합니다. 이는 파일을 읽은 후에 발생하므로 파일은 기본 10으로 읽혀집니다. 좀 더 구체적으로 말하자면, 나는 할 수 있다dc -e '10i' -f file -e '16 i 8000000'
  • [...]문자열을 스택에 밀어 넣습니다. 이 문자열은 매크로로 사용됩니다.
  • 80000000 +스택의 현재 최상위를 16진수 80000000에 추가합니다. 결과를 스택의 맨 위로 푸시합니다.
  • p팝하지 않고 스택의 현재 맨 위를 인쇄합니다. 개행 문자를 인쇄하는 유일한 인쇄 옵션입니다.
  • sa스택의 상단을 팝하고 레지스터 "a"에 저장합니다. 절대 사용하지 않으며 단지 자루 윗부분을 없애기 위한 방법일 뿐입니다.
  • z현재 스택 상단에는 이제 스택 깊이가 있습니다. 재귀 호출을 종료해야 합니다.
  • 11을 스택의 맨 위로 푸시합니다. 이전 푸시의 스택 깊이(z)와 비교하는 데 유용합니다.
  • <r스택에 있는 2개의 값을 비교하여 두 번째 값이 첫 번째 값보다 작으면 레지스터 "r"을 실행합니다. 실제로 스택 깊이를 "1"과 비교합니다.
  • sr레지스터 "r"에 팝되어 저장됩니다. 매크로는 이제 레지스터 "r"에 있으며 스택 깊이가 1보다 큰 한 실행됩니다. 아직 아무것도 호출하지 않았습니다.
  • d스택의 상단을 복사하여 푸시합니다.
  • x매크로 실행 스택의 최상위.
  • d sr x매크로를 복사하고 푸시하면 이제 스택에 2개의 복사본이 있고, 상위 복사본을 팝하고 저장하여 등록하고, 두 번째 복사본을 팝하고 실행합니다.
  • 그래서 스택 깊이와 1을 푸시하고 비교하여 실행한 후 마지막 요소에 대해 다시 hex 값을 추가하여 인쇄합니다.

관련 정보