펄에서 진수변환할때요
글쓴이: 익명 사용자 / 작성시간: 목, 2011/06/16 - 2:36오후
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.. 이 나오더라구요.
도움주시면 감사하겠습니다.
Forums:
http://kldp.org/node/123666
http://kldp.org/node/123666
위 글 올리신 분 같은데,
읽은 값은 @ad 에 들어가 있는데 변환된 건 $bin 에 저장되고 최종 출력을 @ad 를 출력하면 당연히 원래것이 나오겠지요;;;
글 올리실 때 코드는 code 태그로 둘러싸 주시고 hex.asc 파일도 예를 좀 보여주세요.
좋은 하루 되세요!
엇 ㅠ
다시 올려볼게요.ㅠ
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진수로 바꾸려 하는데
큰 따옴표가 있는 것도 있고 없는 것도 있어서 변환이 쉽게 되지가 않습니다. ㅠ
파일을 open()할 때 "<"와 같은 모드 기호와
파일을 open()할 때 "<"와 같은 모드 기호와 파일명을 하나의 인자로 주면 보안적인 문제가 발생할 수 있습니다.
예를들어 실제로 "<"로 시작하는 파일이 있다면 예상치 못한 일이 발생할 것입니다.
그렇기 때문에
과 같이 모드와 파일명을 두개의 인자로 구분하여 여는 것이 좋습니다.
특히 파일 핸들을 타입글롭이 아닌 스칼라 변수에 선언하는 것이 좋습니다. 즉 FH 대신 $FH라고 씁니다.
hex.asc파일을 "+>"모드로 열도록 하셨는데 여기에서 "+"는 쓰기 뿐만 아니라 읽기도 가능하게 한다는 뜻입니다. 하지만 스크립트에서는 hex.asc파일을 읽는 부분이 없습니다. 파일을 새로 열어 쓸 때 이미 있는 내용을 덮어쓰지 않고 파일의 끝에 추가하기 위해서는 ">>" 모드를 사용해야 합니다.
$spl[7]은 이미 하나의 스칼라이므로 이것을 배열(@ad)에 넣을 필요가 없습니다.
따라서 스칼라 변수 $ad에 $spl[7]을 대입하는 것이 적당합니다.
$ad 변수의 앞 뒤의 쌍따옴표는 정규표현식을 사용하여 제거할 수 있습니다.
한줄로 쓸 수도 있습니다.
hex() 함수는 앞에 "0x"가 붙어있어도 붙어있지 않아도 알아서 처리하기 때문에 굳이 "0x"을 붙여서 호출할 필요는 없습니다.
변수를 사용하기 전에는 반드시 선언하는 것이 좋습니다.
이렇게 하기 위해서 warnings, strict 프래그마를 사용하고 변수를 사용하기 전에 my로 선언합니다.
프래그마를 사용하지 않으면 이렇게 작성할 수 있습니다.
두 문자열을 연결한 문자열을 만들때에는 . 연산자를 사용합니다.
그렇기 때문에
이렇게 작성하면 0xAF를 출력합니다.
감사합니다.
이걸 돌리게 되면
0
0
0
0
0
0
.
.
이렇게 나오네요
그리고
Filehandle F1 opened only for output at hex line 9 메시지가 뜨는데
어떻게 수정해야 할까요.
한 필드만 바꿀 거면 amorette 님 글을 보시면
한 필드만 바꿀 거면 amorette 님 글을 보시면 될테고,
보아하니 원하시는 게 16진수인 필드들은 2진수로 바꾸고 나머지 필드는 고스란히 그대로 다시 출력하시려는 것 같아서...
출력:
좋은 하루 되세요!
와_감사합니다.
우선 한 필드에서 해보고
이걸 응용해서 적용하면 원하는 모양이 나올 것 같네요.
도움 감사합니다.
댓글 달기