텍스트 파일의 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진수 값을 이해하면 80000000
32비트 시스템에서 오버플로가 발생합니다(현재는 흔하지 않지만 가능함). 음수 값을 인쇄하지 않으려면 선택하십시오 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
) 을Int
with 로 변환하여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
현재 스택 상단에는 이제 스택 깊이가 있습니다. 재귀 호출을 종료해야 합니다.1
1을 스택의 맨 위로 푸시합니다. 이전 푸시의 스택 깊이(z)와 비교하는 데 유용합니다.<r
스택에 있는 2개의 값을 비교하여 두 번째 값이 첫 번째 값보다 작으면 레지스터 "r"을 실행합니다. 실제로 스택 깊이를 "1"과 비교합니다.sr
레지스터 "r"에 팝되어 저장됩니다. 매크로는 이제 레지스터 "r"에 있으며 스택 깊이가 1보다 큰 한 실행됩니다. 아직 아무것도 호출하지 않았습니다.d
스택의 상단을 복사하여 푸시합니다.x
매크로 실행 스택의 최상위.d sr x
매크로를 복사하고 푸시하면 이제 스택에 2개의 복사본이 있고, 상위 복사본을 팝하고 저장하여 등록하고, 두 번째 복사본을 팝하고 실행합니다.- 그래서 스택 깊이와 1을 푸시하고 비교하여 실행한 후 마지막 요소에 대해 다시 hex 값을 추가하여 인쇄합니다.