instructions.txt
내용이 담긴 파일 이 있습니다.
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
instructions.bin
와 동일한 데이터 의 이진 파일 을 어떻게 만들 수 있습니까 instructions.txt
? 즉, .bin
파일은 파일에있는 192 비트 .txt
와 줄당 32 비트 여야합니다 . 우분투 리눅스에서 bash를 사용하고 있습니다. 사용하려고 xxd -b instructions.txt
했지만 출력이 192 비트보다 깁니다.
답변
one 및 0의 32 비트 문자열을 해당 바이너리로 변환하는 oneliner :
$ perl -ne 'print pack("B32", $_)' < instructions.txt > instructions.bin
그것이하는 일 :
perl -ne
STDIN (instructions.txt
) 에 제공된 입력 파일의 각 줄을 반복합니다.pack("B32", $_)
32 비트 ($_
STDIN에서 읽은) 의 문자열 목록을 가져 와서 이진 값으로 변환합니다 ("b32"
비트 순서 내림차순 대신 각 바이트 내에서 오름차순 비트 순서를 원할 경우 사용할 수 있습니다 (perldoc -f pack
자세한 내용은 참조))print
그런 다음 변환 된 값을 STDOUT으로 출력하고 이진 파일로 리디렉션합니다.instructions.bin
검증:
$ hexdump -Cv instructions.bin
00000000 00 00 00 13 02 d1 20 83 00 73 02 b3 00 73 04 33 |...... ..s...s.3|
00000010 00 73 64 b3 00 00 00 13 |.sd.....|
00000018
$ xxd -b -c4 instructions.bin
00000000: 00000000 00000000 00000000 00010011 ....
00000004: 00000010 11010001 00100000 10000011 .. .
00000008: 00000000 01110011 00000010 10110011 .s..
0000000c: 00000000 01110011 00000100 00110011 .s.3
00000010: 00000000 01110011 01100100 10110011 .sd.
00000014: 00000000 00000000 00000000 00010011 ....
답변
xxd는 단순히이 두 플래그의 결합을 지원하지 않기 때문에 -r
옵션 (역 모드)을 추가하면 xxd -b
실제로 의도 한대로 작동하지 않습니다 -b
. 대신 비트를 16 진수로 먼저 변환해야합니다. 예를 들면 다음과 같습니다.
( echo 'obase=16;ibase=2'; sed -Ee 's/[01]{4}/;\0/g' instructions.txt ) | bc | xxd -r -p > instructions.bin
전체 설명 :
- 괄호 안의 부분은
bc
스크립트를 만듭니다 . 먼저 입력 기준을 이진 (2)으로 설정하고 출력 기준을 16 진 (16)으로 설정합니다. 그 후,이sed
명령instructions.txt
은 4 비트의 각 그룹 사이에 세미콜론으로 내용을 인쇄합니다 . 이는 1 개의 16 진수에 해당합니다. 결과는로 파이프됩니다bc
. - 세미콜론은의 명령 구분 기호
bc
이므로 모든 스크립트는 모든 입력 정수를 다시 출력합니다 (기본 변환 후). - 의 출력은
bc
일련의 16 진 숫자이며 평소와 함께 파일로 변환 될 수 있습니다xxd -r -p
.
산출:
$ hexdump -Cv instructions.bin
00000000 00 00 00 13 02 d1 20 83 00 73 02 b3 00 73 04 33 |...... ..s...s.3|
00000010 00 73 64 b3 00 00 00 13 |.sd.....|
00000018
$ xxd -b -c4 instructions.bin
00000000: 00000000 00000000 00000000 00010011 ....
00000004: 00000010 11010001 00100000 10000011 .. .
00000008: 00000000 01110011 00000010 10110011 .s..
0000000c: 00000000 01110011 00000100 00110011 .s.3
00000010: 00000000 01110011 01100100 10110011 .sd.
00000014: 00000000 00000000 00000000 00010011 ....
답변
내 원래의 대답은 정확 – xxd
하나 받아 들일 수 없다 -p
거나 -r
함께 -b
…
다른 답변이 실행 가능하고 ” 다른 방법 “에 관심이 있다면 다음은 어떻습니까?
입력
$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
산출
$ hexdump -Cv < instructions.bin
00000000 00 00 00 13 02 d1 20 83 00 73 02 b3 00 73 04 33 |...... ..s...s.3|
00000010 00 73 64 b3 00 00 00 13 |.sd.....|
00000018
배쉬 파이프 라인 :
cat instructions.txt \
| tr -d $'\n' \
| while read -N 4 nibble; do
printf '%x' "$((2#${nibble}))"; \
done \
| xxd -r -p \
> instructions.bin
cat
-불필요하지만 명확성을 위해 사용됨tr -d $'\n'
-입력에서 모든 줄 바꿈을 제거하십시오.read -N 4 nibble
– 정확히 4x 문자를nibble
변수 로 읽습니다.printf '%x' "$((2#${nibble}))"
니블을 이진수에서 1 × 16 진수 문자로 변환$((2#...))
-주어진 값을 기수 2 (2 진)에서 기수 10 (10 진)으로 변환printf '%x'
-주어진 값을 10 진수 10 진수에서 16 진수 16 진수로 지정
xxd -r -p
-16 진에서 원시 이진-r
으로 일반 덤프 (-p
)를 반대로 ( )
파이썬 :
python << EOF > instructions.bin
d = '$(cat instructions.txt | tr -d $'\n')'
print(''.join([chr(int(d[i:i+8],2)) for i in range(0, len(d), 8)]))
EOF
- 인용 부호가없는 heredoc (
<< EOF
)을 사용하여 콘텐츠를 Python 코드로 가져옵니다.- 입력이 커지면 효율적이지 않습니다
cat
그리고tr
-깨끗한 (한 줄) 입력을 얻는 데 사용됩니다.range(0, len(d), 8)
-0에서 문자열 끝까지의 숫자 목록을 가져와 한 번d
에 8x 문자 씩 밟습니다.chr(int(d[i:i+8],2))
-현재 슬라이스 (d[i:i+8]
)를 이진수에서 십진수 (int(..., 2)
) 로 변환 한 다음 원시 문자 (chr(...)
)로 변환[ x for y in z]
– 목록 이해''.join(...)
-문자 목록을 단일 문자열로 변환print(...)
-인쇄
답변
CodeGolf SE 사이트에 이것을 게시하려고 시도 할 수도 있지만 다음은 대체 파이썬 버전입니다 (킥 챌린지 용).
python -c "import sys,struct;[sys.stdout.buffer.write(struct.pack('!i',int(x,2)))for x in sys.stdin]" \
< input.txt > output.bin
input.txt
데이터가 포함되어 있고 한 줄에 32 자로 서식이 지정 되었다고 가정 합니다.
이것은 Python 3 struct
패키지와 stdin / out에 대한 쓰기 / 읽기를 사용합니다. (파이썬 2에서는 더 짧았을 것이다).