mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Monday, May 14, 2007

Perl 펄] 이진 문자열 여부 판단, 문자열을 헥사로 출력; Binary String to Hex


문자열(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;
}



▶▶ Perl 펄] 헥사 값을 문자열로 변환 출력 함수; Hex to ASCII String




tag: perl
Perl | 펄

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top