16진수 값이 있습니다.
B455
바이너리로 변경하면
1011 0100 0101 0101
다음 규칙에 따라 비트를 교환하고 싶습니다.
origin bits index : 0123456789ABCDEF
result bits index : D5679123C4EF80AB`
그럼 결과가 나오겠네요
1100 1011 0001 1101
16진수로 변환하는 것은
CB1D
이 작업을 수행하기 위한 스크립트 셸을 구하는 데 도움을 줄 수 있나요?
미리 감사드립니다.
답변1
앞서 언급했듯이 인클로저는 이 작업을 수행하기에 가장 좋은 장소가 아닐 수도 있습니다. 정말로 원한다면 , awk
, dc
및 다음 printf
을 사용하는 sed
솔루션이 있습니다 tr
.
#!/bin/sh
# file: swap-bits
target_order='D5679123C4EF80AB'
indices() {
printf '%s\n' "$1" \
| sed 's/./\0 1+p\n/g' \
| sed '1s/^/10o16i/' \
| dc \
| sed 's/^/substr( $0, /' \
| sed 's/$/, 1 )/' \
| tr '\n' ' '
echo
}
sed 's/^/2o16iF/' \
| sed 's/$/p/' \
| dc \
| sed 's/....//' \
| awk "{ print \"16o2i\" $(indices ${target_order}) \"pq\" }" \
| dc \
| sed 's/^/0000/' \
| sed 's/.*\(....\)$/\1/'
입력을 확인하지 않습니다. 이 target_order
변수는 선호하는 16비트 배열로 설정되어야 합니다.
이 함수는 indices
이와 같은 문자열을 입력으로 사용하고 입력을 정렬하는 데 사용되는 일련의 substr( $0, n, 1 )
명령을 출력합니다.awk
스크립트 본문은 먼저 dc
입력을 16진수에서 2진수로 변환하는 데 사용됩니다. 입력 앞에 F를 붙이고 4개의 1비트를 버려 선행 0비트를 유지합니다. 결과가 입력되고 이진수를 16진수로 변환하라는 awk
명령을 인쇄한 dc
다음 배열된 출력을 인쇄하고 종료하라는 명령을 인쇄합니다 dc
. 이것은 물론 에 대한 입력입니다 dc
. 마지막으로 sed
다시 사용하여 출력에 앞에 0이 있는지 확인합니다(해당하는 경우).
아래와 같이 입력이 켜지고 stdin
출력이 켜집니다 .stdout
$ echo B455 | ./swap-bits
CB15
답변2
perl -wMstrict -le '
my @bits = unpack "(A1)16", sprintf "%016b", hex shift;
my $bitmap = "D5679123C4EF80AB";
@bits = @bits[ map { hex } split //, $bitmap ];
$"="";
print sprintf "%04X", oct "0b@bits";
' "B455"
Result: CB15
간단히:
First we convert the input hex number into it's 16-bit binary equivalent and store the indi-
dual bits in the array @bits. The individual bits are now mapped according to the bitmap wh-
ich is generated by splitting into single bits and getting their decimal equivalents which
are the array indices of @bits. Last step involves in converting the mapped bits into their
4-digit hex counterpart.