펄에서 진수변환할때요

익명 사용자의 이미지

16진수를 2진수로 바꾸려고 하는데요

1. 0x..의 형태가 아닌
그냥 3D 이런식으로 되어있는 진수는 변환 못하나요?

2. 변환 못하는 경우
"3D"에 0x를 삽입하고 싶은데 그냥 해보니 0x"3D"로 붙습니다.

"0x3D" 나 따옴표도 없애고 0x3D로 표현할 방법이 없나요?

우선

open(F1, " open(F2, '+> hex.asc') or die ("zzz");

while(>F1>){

@spl = split(/,/, $_);

@ad = '0x', $spl[7]; #8번째 줄이 16진수
$sp = hex($ad[7]);
$bin = sprintf ("%b", $sp);

print F2 "@ad\n";
}

close F1;
close F2;

이렇게 해봤는데 그냥 다 0000000.. 이 나오더라구요.
도움주시면 감사하겠습니다.

raymundo의 이미지

http://kldp.org/node/123666

위 글 올리신 분 같은데,

읽은 값은 @ad 에 들어가 있는데 변환된 건 $bin 에 저장되고 최종 출력을 @ad 를 출력하면 당연히 원래것이 나오겠지요;;;

글 올리실 때 코드는 code 태그로 둘러싸 주시고 hex.asc 파일도 예를 좀 보여주세요.

좋은 하루 되세요!

kkosu의 이미지


다시 올려볼게요.ㅠ

open(F1, "<j.asc") or die;
open(F2, '+> hex.asc') or die;
 
while(<F1>){
 
 @spl =split(/,/, $_);
 @ad = '0x'. @spl[7];
 
 $sp = hex($ad[7]);
 $bin = sprintf("%b", $sp);
 
 print F2 "$bin\n";
 
}
 
close F1;
close F2;

j.asc는요

1,1,"03",0,1,000,1,"3D",0,0,02F,1,1,1,3E
1,0,"03",0,1,000,1,"3D",0,0,02F,1,1,1,3E
1,0,"03",0,1,000,1,"3F",0,0,03F,1,1,1,3E
1,1,"03",0,1,000,1,"2D",0,0,02F,1,1,1,3E
.....
...
..

이런식의 데이터입니다. 여기서 16진수를 모두 2진수로 바꾸려 하는데
큰 따옴표가 있는 것도 있고 없는 것도 있어서 변환이 쉽게 되지가 않습니다. ㅠ

amorette의 이미지

파일을 open()할 때 "<"와 같은 모드 기호와 파일명을 하나의 인자로 주면 보안적인 문제가 발생할 수 있습니다.
예를들어 실제로 "<"로 시작하는 파일이 있다면 예상치 못한 일이 발생할 것입니다.

그렇기 때문에

open FH, ">", "file"

과 같이 모드와 파일명을 두개의 인자로 구분하여 여는 것이 좋습니다.

특히 파일 핸들을 타입글롭이 아닌 스칼라 변수에 선언하는 것이 좋습니다. 즉 FH 대신 $FH라고 씁니다.

hex.asc파일을 "+>"모드로 열도록 하셨는데 여기에서 "+"는 쓰기 뿐만 아니라 읽기도 가능하게 한다는 뜻입니다. 하지만 스크립트에서는 hex.asc파일을 읽는 부분이 없습니다. 파일을 새로 열어 쓸 때 이미 있는 내용을 덮어쓰지 않고 파일의 끝에 추가하기 위해서는 ">>" 모드를 사용해야 합니다.

$spl[7]은 이미 하나의 스칼라이므로 이것을 배열(@ad)에 넣을 필요가 없습니다.
따라서 스칼라 변수 $ad에 $spl[7]을 대입하는 것이 적당합니다.

$ad = $spl[7];

$ad 변수의 앞 뒤의 쌍따옴표는 정규표현식을 사용하여 제거할 수 있습니다.

$ad =~ s/^"//; # 가장 앞부분(^)의 "를 제거
$ad =~ s/"$//; # 가장 뒷부분($)의 "를 제거

한줄로 쓸 수도 있습니다.

$ad =~ s/^"(.+)"$/$1/;

hex() 함수는 앞에 "0x"가 붙어있어도 붙어있지 않아도 알아서 처리하기 때문에 굳이 "0x"을 붙여서 호출할 필요는 없습니다.

변수를 사용하기 전에는 반드시 선언하는 것이 좋습니다.
이렇게 하기 위해서 warnings, strict 프래그마를 사용하고 변수를 사용하기 전에 my로 선언합니다.

#!/usr/bin/env perl
use warnings;
use strict;
 
open my $F1, '<', 'j.asc' or die;
open my $F2, '>>', 'hex.asc' or die;
 
while (my $line = <$F1>) {
    my @spl = split ",", $line;
    my $ad  = $spl[7];
    $ad =~ s{^"(.+)"$}{$1};
    my $sp = hex $ad;
    my $bin = sprintf "%08b", $sp;
    print $F2 "$bin\n";
}

프래그마를 사용하지 않으면 이렇게 작성할 수 있습니다.

#!/usr/bin/env perl
 
open F1, "<", "j.asc" or die;
open F2, ">>", "hex.asc" or die;
 
while ($line = <F1>) {
    @spl = split ",", $line;
    $ad  = $spl[7];
    $ad  = s{^"}{};
    $ad  = s{"$}{};
    $sp  = hex $ad;
    $bin = sprintf "%08b", $sp;
    print F2 $bin, "\n";
}

두 문자열을 연결한 문자열을 만들때에는 . 연산자를 사용합니다.
그렇기 때문에

$ad = "0x" . "AF";
print $ad;

이렇게 작성하면 0xAF를 출력합니다.
kkosu의 이미지

이걸 돌리게 되면
0
0
0
0
0
0
.
.
이렇게 나오네요

그리고
Filehandle F1 opened only for output at hex line 9 메시지가 뜨는데
어떻게 수정해야 할까요.

raymundo의 이미지

한 필드만 바꿀 거면 amorette 님 글을 보시면 될테고,

보아하니 원하시는 게 16진수인 필드들은 2진수로 바꾸고 나머지 필드는 고스란히 그대로 다시 출력하시려는 것 같아서...

#!perl
use strict;
use warnings;
 
while (my $line = <DATA>) {
    chomp $line;
 
    my @spl = split /,/, $line;
 
    for my $c ( 2,7,10,14 ) {   # 16진수 필드들의 인덱스
        $spl[$c] =~ s/([0-9a-fA-F]+)/sprintf("%b", hex($1))/e;
    }
 
    print join(",", @spl), "\n";
}
 
 
__DATA__
1,1,"03",0,1,000,1,"3D",0,0,02F,1,1,1,3E
1,0,"03",0,1,000,1,"3D",0,0,02F,1,1,1,3E
1,0,"03",0,1,000,1,"3F",0,0,03F,1,1,1,3E
1,1,"03",0,1,000,1,"2D",0,0,02F,1,1,1,3E

출력:

1,1,"11",0,1,000,1,"111101",0,0,101111,1,1,1,111110
1,0,"11",0,1,000,1,"111101",0,0,101111,1,1,1,111110
1,0,"11",0,1,000,1,"111111",0,0,111111,1,1,1,111110
1,1,"11",0,1,000,1,"101101",0,0,101111,1,1,1,111110

좋은 하루 되세요!

kkosu의 이미지

우선 한 필드에서 해보고

이걸 응용해서 적용하면 원하는 모양이 나올 것 같네요.

도움 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.