Monday, May 14, 2007
Perl 펄] 이진 문자열 여부 판단, 문자열을 헥사로 출력; Binary String to Hex
문자열(String)은 일반 문자로 구성되어 있을 수도 있고, "제어 문자" 같은, 눈에 보이지 않는 이진 데이터로 이루어져 있을 수도 있습니다. 이 여부를 판단하는 함수입니다.
더 정확히 말하자면, "ABC abc 123 !@#$% ..." 등의 영문+숫자+기호처럼 "영문 키보드로 직접 입력 가능한 문자" 여부만을 판단합니다. 그래서 한글 문자열일 경우에도 이진 문자열로 판단하는 한계가 있습니다.
일반 문자들 속에 제어문자가 하나라도 섞여 있으면, 이진 문자열로 간주합니다.
파일명: example.pl
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
▶▶ Perl 펄] 헥사 값을 문자열로 변환 출력 함수; Hex to ASCII String
더 정확히 말하자면, "ABC abc 123 !@#$% ..." 등의 영문+숫자+기호처럼 "영문 키보드로 직접 입력 가능한 문자" 여부만을 판단합니다. 그래서 한글 문자열일 경우에도 이진 문자열로 판단하는 한계가 있습니다.
일반 문자들 속에 제어문자가 하나라도 섞여 있으면, 이진 문자열로 간주합니다.
파일명: example.pl
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
#!/usr/bin/perl
use strict; use warnings;
# 이진 문자열 만들기
my @bytes = ( 0x41, 0x20, 0x00, 0x01, 0x02, 0xFF ); # 이진 데이터 배열 만들기
my $s = pack "C*", @bytes; # 이진 배열을 이진 문자열로 합치기
# 일반 텍스트 문자열이면 그대로 출력
# 이진 문자열이면 헥사로 출력하기
if (isPrintableString($s)) {
print $s, "\n";
}
else {
print stringToHex($s), "\n";
}
# 출력 결과: 41 20 00 01 02 FF
$s = "Apple";
if (isPrintableString($s)) {
print $s, "\n";
}
else {
print stringToHex($s), "\n";
}
# Apple
$s = "똠방";
if (isPrintableString($s)) {
print $s, "\n";
}
else {
print stringToHex($s), "\n";
}
# 8C 63 B9 E6
# 한글도 이진 문자열로 간주됨
# 문자열이 영문 키보드로 입력할 수 있는 문자들만으로
# 구성되어 있으면 참(true)을 반환
sub isPrintableString {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
foreach (@a) {
next if ($_ == 0x0A || $_ == 0x0D || $_ == 0x09);
return 0 if ($_ < 0x20 || $_ > 0x7E); # 키보드로 입력할 수 없는 문자일 경우는 거짓(false) 반환
}
return 1; # 그밖의 경우는 참(true) 반환
}
# 문자열을 헥사로 출력하는 함수
sub stringToHex {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
my $s = "";
foreach (@a) {
$s .= sprintf("%02X ", $_);
}
return $s;
}
use strict; use warnings;
# 이진 문자열 만들기
my @bytes = ( 0x41, 0x20, 0x00, 0x01, 0x02, 0xFF ); # 이진 데이터 배열 만들기
my $s = pack "C*", @bytes; # 이진 배열을 이진 문자열로 합치기
# 일반 텍스트 문자열이면 그대로 출력
# 이진 문자열이면 헥사로 출력하기
if (isPrintableString($s)) {
print $s, "\n";
}
else {
print stringToHex($s), "\n";
}
# 출력 결과: 41 20 00 01 02 FF
$s = "Apple";
if (isPrintableString($s)) {
print $s, "\n";
}
else {
print stringToHex($s), "\n";
}
# Apple
$s = "똠방";
if (isPrintableString($s)) {
print $s, "\n";
}
else {
print stringToHex($s), "\n";
}
# 8C 63 B9 E6
# 한글도 이진 문자열로 간주됨
# 문자열이 영문 키보드로 입력할 수 있는 문자들만으로
# 구성되어 있으면 참(true)을 반환
sub isPrintableString {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
foreach (@a) {
next if ($_ == 0x0A || $_ == 0x0D || $_ == 0x09);
return 0 if ($_ < 0x20 || $_ > 0x7E); # 키보드로 입력할 수 없는 문자일 경우는 거짓(false) 반환
}
return 1; # 그밖의 경우는 참(true) 반환
}
# 문자열을 헥사로 출력하는 함수
sub stringToHex {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
my $s = "";
foreach (@a) {
$s .= sprintf("%02X ", $_);
}
return $s;
}
▶▶ Perl 펄] 헥사 값을 문자열로 변환 출력 함수; Hex to ASCII String
tag: perl
Perl | 펄
<< Home