오유인페이지
개인차단 상태
프로그래머님의 개인페이지입니다
회원가입 : 07-05-23
방문횟수 : 549회
닉네임 변경이력
일반
베스트
베오베
댓글
437 2015-08-19 21:00:11 1
[새창]
저도 그 글보면서 좀 이건 아니다 싶었어요

내용은 재끼고 중간에 답변중에 비트연산으로 하는 재미난 댓글이 있어서 좀 보다가 댓글 남깁니다.

문제의 답변 코드는 다음과 같은데요

#include <stdio.h>
int main()
{
int i, j;
printf("-----n");
for (i = 0x00477dc4, j = 0x01084210; i; i >>= 1, j >>= 1) {
printf("%c%c", (i&1)*('*'-32) + 32, (j&1)*10);
}
printf("n");
printf("-----n");
return 0;
}

이 코드의 핵심은 글쓴이님께서 생각하신것처럼 비트 연산입니다. 중요한건 i 값과 j 값이죠

먼저 ascii table 에서 * 은 10진수로 42, 스페이스는 32, 그리고 띄어쓰기는 10 입니다.

저 for 문 안에 있는 printf 에서 하는일은 i값과 j 값의 가장 하위 비트를 보고 * 을 찍을건지 스페이스를 할건지 띄어쓰기를 할건지 결정을 합니다.

결론적으로 printf 는 다음과 같은 순서로 동작합니다.
(처음 맨 윗줄만 예를들면 다음과 같습니다.

printf("%c%c", 0x20, 0x00); // 띄어쓰기
printf("%c%c", 0x20, 0x00); // 띄어쓰기
printf("%c%c", 0x3A, 0x00); // *
printf("%c%c", 0x20, 0x00); // 띄어쓰기
printf("%c%c", 0x20, 0x0a); // 띄어쓰기 + 한칸 띄기

이렇게 되면 처음에 두칸 스페이스 , 별(*) , 두칸 스페이스 , 그리고 띄어쓰기가 완성됩니다.

자세히 비트 연산을 통해 살펴 보면 먼저 i 는 0x00477dc4 인데 이를 하위 1바이트만 보면

1 1 0 0 0 1 0 0 과 같이 되어 있습니다. 오른쪽부터 왼쪽으로 하나씩 가신다고 생각하시고 0 이면 띄어쓰기 1 이면 별을 찍습니다.

마찬가지로 j 의 비트 연산을 보면

0 0 0 1 0 0 0 0 과 같이 되어 있고 여기서 오른쪽부터 왼쪽으로 하나씩 간다고 생각하면 0 일때 아무것도 안찍고 1 일때는 한칸 띄어쓰기를 합니다.

저도 초등학교때 이런문제를 본것 같은데 1 중 for문으로도 이렇게 풀리는게 신기하네요 ^^
435 2015-08-18 18:52:50 0
오늘자 홈팬들에게 기립박수 받은 추신수의 어시스트!! [새창]
2015/08/18 11:53:24
GO ! CHOO !
434 2015-07-20 13:02:26 0
알고리즘은 영업비밀로 남겨놔도 되는가?? [새창]
2015/07/20 11:59:02
참 재미있는 토픽인것 같습니다.

아마 다양하게 찬반 의견이 나올 수 있는 것 같네요.

저도 곰곰히 생각해 봣는데 어디까지 공개 하고 어떻게 공개 할지를 고민해보면 참 쉽지 않는 내용이네요 =)
433 2015-07-20 12:58:27 0
발코딩의 시대가 왔습니다. [새창]
2015/07/19 16:08:12
저...저도 ... Function 키랑 텐키 없는걸로 ...
432 2015-07-20 12:56:32 0
[새창]
헬로 월드님 말씀에 키보드를 '탁!' 치고 갑니다.
431 2015-07-20 12:54:47 0
해외 취업 글이 많이 보여서 적어봅니다... [새창]
2015/07/20 09:14:42
좋은 내용 감사합니다 ~ :-)
430 2015-07-20 12:51:30 0
SKT, IoT 해커톤 개최한다고 합니다. [새창]
2015/07/20 09:52:19
뉴욬커 // 해커톤 자체는 굉장히 흥미로운 경험이 될 수 있는 좋은 기회 인것 같습니다. 한 번 도전해 보시고 경험을 기반으로 더 좋은 기회를 만드실수 있을것 같아요! 두려움은 떨쳐버리시고 일단 도전해보세요! 'ㅁ'/
429 2015-07-20 12:48:19 0
프로그래밍 언어란? - 6 [새창]
2015/07/20 12:29:01
함수에 지역 변수가 꽤 존재한다면 재귀 함수를 은근히 조심하셔야 합니다.

50 바이트 정도의 스택 프레임이 5000번 가량 재귀를 돌면 일반적인 스택 커밋 사이즈는 스택 오버플로우를 뱉습니다.
(Vista 이상 윈도우 계산기 (공학용)에서 1/999 한 뒤, F-E 버튼을 누르면 스택 오버플로우가 발생하는 원리)

inline 의 경우는 케바케 인것 같은데 일반적으로 작은 inline 을 만들경우 (전체 호출이 function call 시 발생되는 코드들 보다 작을 경우), 함수 호출에 대한 오버 해드를 줄일 수 있기 때문에 코드 사이즈가 줄어 드는 효과를 볼 수 있다고 하네요 :-)
428 2015-07-20 12:25:07 0
게임 프로그래머 되려면 게임 끊어야됨? [새창]
2015/07/20 10:14:15
겜 프로그래머도 케바케 이긴 하지만 유명 게임 회사들은 고학력자들이 많습니다. (겜 프로그래밍책을 한번 참고해보시면 그 이유가 명확하죠 +_+)

겜을 취미로 하셔도 커버 가능하시면 겜하셔도 상관은 없지만 제 생각엔 잠 잘시간은 있으시려나 모르겠어요 .... =_=
427 2015-07-20 12:21:21 0
안드로이드 개발자분들 궁금한게있습니다 [새창]
2015/07/20 10:39:27
보통 제휴 업체 DB는 영업에서 관리를 하고 이를 편하게 하기 위한 인터페이스를 개발자들이 만들어 줍니다.

규모에 따라 다르긴 하지만, 서버 1대로 위의 서비스를 만들려면 한 서버에 웹서버, DB 서버 등등이 올라가고

앱에서 특정 URL 이나 특정 프로토콜을 이용하여 서버에 정보를 요청하고 받는 형식으로 합니다

큰 그림은 질문자님께서 생각하시는게 맞는것 같습니다 'ㅅ'/ 화이팅~
426 2015-07-18 02:37:55 1
php] 가입시 이메일 인증 시스템 구축하기 (?) 질문 [새창]
2015/07/18 02:30:26
잘 생각하신것 같아요 'ㅁ'

마지막은 4-1만으로도 충분할것 같습니다.

추가적으로 발급한 해쉬나 암호 url의 접근에 대한 expired time 잘 체크해주시면 될것 같아요 'ㅡ'/ 화이팅
425 2015-07-18 02:32:02 0
리버싱이나 크랙 전문가분 도움요청합니다. [새창]
2015/07/18 02:08:10
타사 어플이나 랭킹 알고리즘 벤치 마킹 하시려고 하는건가요 ~_~

검색 엔진들이 자주 랭킹 알고리즘을 바꿔서 힘들다고 들었는데 아직도 가능은 한가보네요
424 2015-07-18 02:25:23 0
여러분 제가 재미있는 암호화 문제를 가지고 왔습니다. [새창]
2015/07/17 20:23:51
음 마지막에 인코딩 때문에 고생했네요....

문제 마지막에 gzip을 복호화 한 뒤, 나온 깨진 인코딩을 한글로 복호화 했던 프로세스를 적으면 다음과 같습니다.

1. notepad.exe 에서 마지막에 복호화한 바이트 코드를 넣으면 나오는 문자열을 복사합니다.
2. notepad.exe 에서 새로운 파일을 만든 뒤, 한글을 몇 글자 넣고 ANSI로 저장합니다.
3. 다른 에디터 (저는 sublime 2)에서 해당 파일을 읽으면 해당 한글이 깨져서 보입니다. 그 밑에 (1)에서 복사했던 문자열을 붙여 넣기 하고 저장합니다.
4-1. 그리고 크롬에다가 파일을 드래그 해서 인코딩을 한글로 해주시거나
4-2. 아래 파이썬 코드를 콘솔에서 실행하여 결과를 확인하실 수 있습니다.

#-*- coding: utf-8 -*-
print open('./result.txt', 'r').read()

문제의 깨졋다고 생각하는 인코딩과 정상적으로 보이는 한글 인코딩의 차이는 한글의 1글자가 사용하는 바이트 수에 있습니다. 깨진 인코딩은 한글 1글자에 4바이트씩 할당이 되어 있고 우리가 일반적으로 쓰는 UTF-8 형식은 한 글자당 2바이트씩 표현을 하기 때문에 깨져서 보인겁니다. (한글은 2, 3, 4바이트를 문자의 특징에 따라 변경)

제가 했던 방식도 꼼수를 이용한 것인데 혹시 좀더 명확하게 해결하신분 계시면 댓글 한 번 부탁드립니다.
423 2015-07-15 18:47:48 0
[새창]
리버싱 엔지니어링 이라고 완성품을 뜯어 보고 내부 구조를 이해 하는 방식이 있습니다.

물론 컴퓨터, 해킹쪽에만 있는 용어는 아니고 메모리나 다른 분야에서도 많이 쓰이는 용어 입니다.

컴퓨터쪽에서 리버싱 엔지니어링하는 것을 힘들게 하기 위해 프로그램 내에 더미 코드를 넣거나 안티 리버싱 기능을 넣어서 분석을 힘들게 하는 방법도 있습니다.
< 이전페이지 다음페이지 >
< 21 22 23 24 25 >
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호