블로그 이미지
포도알77
IT 방랑기

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Notice

2019.05.06 09:00 프로그래밍

IEEE754는 부동소수점을 표현하는 표준으로, 일반적으로 사용하는 C, C++, Java와 같은 프로그래밍 언어의 대부분이 이를 사용한다. 

 부동 소수점외에도 우리에겐 익숙하지 않은 고정 소수점 표현 방식도 있는데, 이는 특정 자릿수에 소수점이 있다고 가정하고 이를 정수로 표현하는 방식이다. 예를 들어 10^3 위치에 소수점이 있다고 생각한다면 12000과 120을 나타내는 고정 소수점은 각각 12.000과 0.120을 뜻하게 된다.

 반면 부동소수점은 이 소수점의 위치를 고정하지 않고 지수부와 가수부의 값에 의하여 변동되므로, 더 큰 값이나 세밀한 값을 표현할 수 있게된다. 

 

 IEEE754에서는 부동 소수점을 3가지로 구성하는데, 최상위 비트부터 부호비트, 지수비트, 가수비트이다. 32비트 단정도와 64비트 배정도에서는 각각 1/8/23와 1/11/52으로 표현한다. 

 

[예제]

 간단한 예를 들어 부동소수점을 표현해보자. 123.625라는 값을 32비트 단정도로 표현해보자. -123.625는 정수부의 123을 8비트로 표현하여 01111011이며, 가수부 0.625를 0.5+0.125으로 표현할 수 있으므로 0.101이 된다. 이는 011111011.101가 되며 정수부에 한자리만 오도록 조작을 조금 해보면 1.111011101 * 2^7으로 표현할 수 있다.

 이제 부호비트는 음수이므로 1으로 결정되었고, 지수 비트는 2^7에서 7을 127(bias)과 더하여 134인 10000110으로 표현한다. 마지막으로 가수부는 following zero를 0으로 채워 11101110100000000000000을 넣어준다. 

 이와 같은 과정을 거치면 1 / 10000110 / 11101110100000000000000 와 같이 나타나게 된다.

 

[유효자리]

유효자리 계산은 쉽게 할 수 있다. 부동 소수점에서 값은 항상 정규화되어서 표현되기 때문에, 가수부의 정밀도에 따라서 유효자리가 결정된다.

 32비트 단정도에서는 가수비트가 23이며 이는 1/2^23까지 표현할 수 있다. 2^10은 1024으로 10^3이며, 2^23는 대략적으로 8*10^6이다. 따라서 유효자리는 6자리까지라고 할 수 있다.

반대로 64비트 배정도는 52자리로 이를 표현하므로 2^52는 약 4*10^15이며 15자리까지 표현할 수 있다.

posted by 궁금한 포도알77
2019.04.14 21:14 프로그래밍/서버

4. 설치 방법


  사실상 설치방법이라고 뭐 있을까? 다운로드 링크는 아래와 같다.

소스포지 다운로드 링크 autoset 다운로드 페이지

 

 한가지 고려해야 할 점은, 다운로드 속도가 너무 느리다는 것이다. 일단 한 10분은 생각해야한다.  자신 운영체제에 적합한 것을 다운로드 받자.  

 설치과정은 아래의 그림과 같이 하면된다. 언제나 설치는 그랬듯, default값으로 하면서 다음만 계속 누른다.

 

 

 

4. 실행 방법


실행 방법은 진짜 apmsetup과 동일하다. 일단 autoset 매니저라는 프로그램(apmsetup monitor와 동일한 기능)을 실행하면, 아래와 같이 프로그램이 켜진다.

 

  이대로 웹서버와 mysql을 실행하면, 아래와 같이 동작한다.  

 

 웹 서버 포트 : 80

웹 서버 파일 :  C:\AutoSet9\public_html

mysql 포트 : 3036

  이때 http://localhost/로 접속해서 아래와 동일한 페이지가 나타난다면, 정상 설치된 것이다.  

  마지막으로, 웹 서버 파일 위치를 변경하는 방법은 아래와 같다. 설정 -> 웹 서버 기본 설정 -> 홈 디렉토리 변경  

 

 

  해당 폴더에 워드프레스를 넣거나 혹은 워드프레스 폴더를 홈 디렉터리로 변경해주면, 아래와 같이 워드프레스가 실행된다.

 

엮인 글

[서버] 새로운 x64 APM, AUTOSET 설치하기 1/2

posted by 궁금한 포도알77
2019.04.14 20:58 프로그래밍/서버

1. 들어가면서


 집에서 컴퓨터로 웹호스팅을 하거나, 아니면 개발중인 웹 테스트를 위한 서버 구축을 위해서 apmsetup을 사용하는 사람들이 꽤나 많을 것으로 생각된다.

 apm_setup도 매우 편리한 프로그램이기는 하나, 언제부터인가 업데이트가 종료되었고 심지어 홈페이지도 안나온다. 물론 포털사이트에서 검색하면 설치 프로그램을 받을 수는 있으나, 이마저 구하기 번거로운게 사실이다.  

 

2. 대체제 Autoset


그래서 하고싶은 말이 뭐야?

라고 묻는다면, Autoset이라는 비슷한 프로그램이 존재한다는 것을 알리는 것이다.

 만약 apm_setup을 너무 오랜 기간 써와서, 적응이 안될까 걱정된다.는 말은 던져버리자. 심지어 인터페이스마저도 비슷하고, 동일한 phpMyAdmin등을 제공한다.

 어느 프로그램이 먼저 나왔는지는 확인 해보지 않아 모르겠지만, 그냥 똑같다.

 

3. 왜 써야하는가?


 물론 왜 써야하는지는 알아야되지 않을까? 이전까지는 apmsetup, 32비트 환경에서 웹 서버를 개발하는데 문제를 찾지못했다. 하지만, 어느 순간부터 계속해서 PHP 버전과 MySQL 버전 문제가 발생하였다.

 예를 들어, 워드프레스 플러그인중 몇몇은 PHP 5.3버전 이상을 요구한다거나, 플러그인을 설치하면 갑자기 느려져서 몇일을 고생했지만 PHP 버전을 바꾸고 나니 언제그랬냐는듯 정상으로 돌아온다.

 이 정도만 해도 충분히 교체를 진행할 이유가 된다.

autoset 지원 목록 (출처 autoset.net)

 그리고 더 중요한 사실이 있는데, 그중 하나는 x64비트를 지원한다는 것이다. 사실 워드프레스를 사용하는 사람들중의 대부분은 PHP, HTML, JS.. 등을 들어는 보았으나 실제 코딩하지 못하는 사람들이 대부분이며, x32머신에서 x64 데이터형 계산이 매우 느려진다는 사실도 잘 모른다.

  아무튼 그냥 x64를 설치하는게 여러모로 좋다는 것을 알리고, 설치해보자.    

다음글에서 계속

엮인 글

[서버] 새로운 x64 APM, AUTOSET 설치하기 2/2

posted by 궁금한 포도알77
2019.04.14 19:38 프로그래밍/Java

1. 그래프 데이터 베이스 neo4j

 요즘 너무 다양한 데이터 베이스가 많다. 가장 많이 들어봤을 법한 데이터베이스는 mySQL일 것이다. neo4j와 달리 mySQL은 관계형 데이터 베이스이다. neo4j는 그래프형태로 소셜 네트워크와 같이 그래프 (노드와 링크)를 표현하는데 매우 효율적이다.

 만약 관계형 데이터 베이스를 이용하여, 그래프를 표현하려면 계속해서 join을 실행해야 하는데, 관계형 데이터 베이스를 사용해본 사람이라면 얼마나 비효율적인지 알 수 있을 것이다.

 비록 간단한 프로그램이지만, neo4j를 사용한다는 생각으로 간단하게 설치와 java 연동을 해보자.

2. neo4j 설치 방법

neo4j의 사이트는 아래의 링크와 같다.

https://neo4j.com/

 

 

 다운로드 위치는 처음 홈페이지를 들어가서 보이는 download를 선택해도 좋고,  다운로드 바로가기를 선택하여 이동하여도 좋다.

여기서 개인용 neo4j와 기업용 neo4j로 나뉘는데, 개인용 (community)를 선택하자.

NEO4J - 서버 x64 WIN

 다운 받은 neo4j 인스톨러는 서버 프로그램으로, 각 데이터 베이스의 admin 페이지와 같다고 생각하자. 여기서 쿼리를 실행할 수도 있고, 데이터도 볼 수 있다. 다만!! 서버 프로그램과 자바에서 동시에 db 접근할 수 없는것은 함정이다. (썩었다.)

 다음으로는, Java에서 사용할 라이브러리 (기존 JDBC와 같은 드라이버라고 생각하면 된다.)를 다운 받아야 한다. 하지만, 나는 어디서 받는지 모르겠다. 그냥 여기서 다운받자. 속도도 더 빠를 것이다.

NEO4J - JAVA DRIVER

3. Java eclipse와 연동 방법

다운받은 neo4j 자바 드라이버 파일 압축을 풀고 이클립스에서 라이브러리를 추가하자.

 

posted by 궁금한 포도알77
2019.04.10 14:50 프로그래밍/C, C++

1. Visual Studio 2015와  OpenGL 사용

아래 글 참조

https://jcdgods.tistory.com/374  

 

[C/C++] 간단하게 Visual Studio 2015에 C++ OpenGL 설치하기

1. OpenGL 다운로드 OpenGL Windows 압축 파일 다운로드 OpenGL 홈페이지에서 윈도우 C++용 GLUT을 다운 받아서 원하는 위치에 압축을 푼다. 그냥 D드라이브가 편하니까 D:\glut에 저장하였다. 2. Visual Studio..

jcdgods.tistory.com

2. 코드

https://github.com/ChangdaeJeong/triangluation-openGL

위의 깃허브 참조  

 

ChangdaeJeong/triangluation-openGL

triangluation-openGL. Contribute to ChangdaeJeong/triangluation-openGL development by creating an account on GitHub.

github.com

3. 데모 영상

콘솔창 + OpenGL 영상 https://www.youtube.com/watch?v=pxCs9ynF_OA&feature=youtu.be 

 OpenGL 영상  https://www.youtube.com/watch?v=fBwQU2o17aQ  

4. 기타

Triangulation 할때, Upper & Lower Chain을 이미 알고 있다는 가정하에, 구현하였음.

초기 시작시 X-coordinate 순으로 점이 추가됨. 그 다음 Upper Chain은 초록색, Lower Chain은 파랑색으로 나타남.

여기서 Leftmost, Rightmost 점이 파란색인건 그냥 무시하기 바람.

어차피 알고리즘 자체에서 양 끝 점이 어느 체인에 포함되는지 여부는 딱히 필요없음.

Triangulation Pseudo Code는 아래와 같음.

known Upper & Lower chain
merge Upper & Lower chain ordered by X coordinate, Y coordinate asc
init stack, list
push 1st, 2nd points into stack
loop from 2 to n-1
	if the top point of the stack and ith point are in same chain
		stack.pop
		loop stack is not empty
			pts <- stack.top
			stack.pop
			if pts and ith point make a diagonal
				insert the diagonal into L
		push the last point which was saved in stack
		push ith point into stack
			
	otherwise
		while stack.size >= 1
			pts <- stack.top
			stack.pop
			temporalStack <- pts
			if pts and ith point make a diagonal
				insert the diagonal into L
		stack.pop
		recover stack from temporalStack
		push ith point into stack

  그리고 OpenGL은 글자 출력이 딱히 편리한게 아니라서, 스택의 상태나 리스트의 상태는 콘솔에 출력하였음. 참고.  

posted by 궁금한 포도알77
2019.04.10 14:46 프로그래밍/C, C++

1. OpenGL 다운로드

OpenGL Windows 압축 파일 다운로드

OpenGL 홈페이지에서 윈도우 C++용 GLUT을 다운 받아서 원하는 위치에 압축을 푼다.

그냥 D드라이브가 편하니까 D:\glut에 저장하였다.  

 

2. Visual Studio 프로젝트 만들기

비주얼 스튜디오를 켜고, Windows 32 console 프로젝트를 하나 생성한다. 그런 다음 솔루션 탐색기에서 해당 프로젝트를 우클릭하여, 속성으로 들어간다.

 

 

그런 다음 속성 페이지에서 우측 상단에 위치한 구성 관리자를 연다. 그런 다음 활성 솔루션 구성을 클릭하여, 새로 만들기를 한다. 새로 만들 솔루션 구성 이름은 아무거나, OpenGL_debug로 만들었다.

   

 

C/C++ 수정

C/C++ 일반탭 또는 VC++ 디렉터리에 들어가서 포함 디렉터리에 "D:\glut" (자신이 GLUT 압축을 푼 위치)를 포함한다.  

 

링커 수정

링커-일반 탭으로 들어가서 포함 디렉터리에 "D:\glut"(자신이 GLUT 압축을 푼 위치)을 추가한다.

링커-입력 탭으로 들어가서 추가 종속성에 "glut32.dll"을 추가한다.  

 

환경 변수 편집

환경 변수 편집으로 들어가서 Path 환경 변수에 "D:\glut"을 추가한다.  

그리고 VS 를 껏다켠다.  

아래의 openGL 코드를 실행하면, 정상적으로 동작할 것이다.

#include <glut.h>
void Display() {
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
	glVertex3f(-0.5, -0.5, 0.0);
	glVertex3f(0.5, -0.5, 0.0);
	glVertex3f(0.5, 0.5, 0.0);
	glVertex3f(-0.5, 0.5, 0.0);
	glEnd();
	glFlush();
}

int main() {
	glutCreateWindow("OpenGL Hello World!");
	glutDisplayFunc(Display);
	glutMainLoop();
	return 0;
}

 

 opengl 안되는 경우 증상

컴파일이 안되는 경우 : VS 구성 관리자의 glut 라이브러리 추가를 잘못 한것.

실행이 안되는 경우 : glut32.dll이 없다고 실행이 안되는 경우, 환경 변수 편집이 잘못 되었거나, VS 껐다 켜지 않은 것.

posted by 궁금한 포도알77
2019.04.05 18:49 프로그래밍/Python

 이번 포스트에서는 파이썬과 PILLOW 라이브러리를 이용하여, 백그라운드 이미지에 글자 추가하여 저장하는 프로그램을 담아볼 예정이다.

예전에 로또 당첨 정보를 이미지화하여 출력하는 프로그램을 작성한 적이 있었는데, 이번에는 내 블로그의 BOJ 위키 포스트에 대표 이미지를 문제 번호를 포함하여 출력하여 사용하려고 작성한다.

 

 전체적인 흐름은 1) 백그라운드 이미지 읽기, 2) 이미지에 포함될 글자 생성, 3) 글자 위치 지정, 4) 백그라운드 이미지 + 글자를 파일로 저장하는 과정을 거친다.

 

 이를 위해서는 PIL 라이브러리가 필요하다. 해당 라이브러리는 아래의 명령을 통하여 설치할 수 있다.

sudo apt-get install pillow

 

 

 정상적으로 Pillow 라이브러리를 설치하였다면, 아래의 코드를 Python2에서 실행해보자. 실행에 앞서 이미지 위치나 패스는 직접 설정하자. 

# _*_ coding: utf-8 _*_
import sys
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
im=Image.open("BOJ WIKI.png")
pixelMap = im.load()

newimg = Image.new( im.mode, im.size)
pixelsNew = newimg.load()
for i in range(newimg.size[0]):
    for j in range(newimg.size[1]):
        pixelsNew[i,j] = pixelMap[i,j]
        
font = ImageFont.truetype('font/NanumGothicBold.ttf', 100)
text = unicode("- "+sys.argv[1] + "번 풀이 -", 'utf-8', 'ignore')

size = font.getsize(text)[0]

ImageDraw.Draw(newimg).text(((newimg.size[0]-size)/2,500),text,(0,0,0),
                            font=font)
newimg.convert('RGB').save('result/boj-'+sys.argv[1]+'.jpg')

우선 첫라인의 주석문장은 utf-8으로 코딩되어 있음을 뜻한다. 즉 한글을 출력하기 위한 인코딩 정보를 포함하고 있다

두번째로 sys는 파이썬 프로그램 실행시 입력받은 문제 번호를 읽어오기 위해(sys.argv) 임포트되었다. 그리고 PILLOW 라이브러리에서 Image, ImageDraw, ImageFont를 가져온다.

이 과정이 끝나면 백그라운드 이미지로 사용할 사진을 읽어오고, 새로운 이미지를 생성하여 카피한다.

 

이제 이미지에 쓸 문구를 처리해야 하는데, 폰트 사이즈는 무조건 폰트 변수를 만들어야 변경이 된다. 따라서 나눔고딕 폰트를 받고 크기를 100으로 셋업한다음, 문구를 유니코드로 저장한다.

그 다음 문구를 중앙 정렬하기 위하여 사이즈를 측정하고 ImageDraw.Draw함수를 이용하여 이미지에 덮어쓴다. 이때 첫 매개 변수는 ((문구 시작 X, 문구 시작 Y), 문구, (R, G, B))로 구성되며, font도 함께 전달한다.

 

마지막으로 이미지를 RGB로 바꾸어 jpg 이미지로 저장한다.

 

 

 

posted by 궁금한 포도알77
2019.04.03 22:06 프로그래밍/Javascript

1. HTML에서 Javascript만으로 IP 주소 얻기

HTML에서 IP주소를 확인하기 위한 방법으로 대부분 사람들이 Java script를 이용하려고 한다. 단도직입적으로 HTML내에서 Javascript만으로 IP 주소를 얻을 수 없다.

2.  IP address를 구하는 방법

서버는 사용자의 요청(Request)을 받을 때 TCP 또는 UDP 헤더를 보고 IP 주소를 알 수 있다.  즉, IP 주소를 얻기 위해서는 서버단에서 처리를하여 값을 되돌려 주어야 한다.

따라서 할 수 있는 방법으로 1. 서버를 구현한다. 2. API를 사용한다. 두개로 좁힐 수 있다.

(1) 서버를 구현하는 방법

 많은 사람들이 사용하는 Node.js나 php를 이용한다면, 많은 소스코드가 인터넷 상에 존재한다.  애초에 이런 방법을 찾기위해서 이 페이지를 찾은 것은 아닐 것이다.

(2) API 이용하기

 정말 간단하다. HTML에 아래의 스크립트를 추가하자. 그리고 Javascript에서 ip 변수를 이용하면 된다.

<script type="text/javascript" src="https://jsonip.com"></script>

그 이유는 서버가 클라이언트의 IP주소를 추출해서 변수에 하드코딩한 다음 스크립트로 반환한다. 이해가 안된다면 아래의 링크를 클릭해보자.

https://jsonip.com

posted by 궁금한 포도알77
2019.04.03 22:02 프로그래밍/Javascript

IP 주소를 이용하여, Geolocation 정보를 얻을 수 있다. 여기서 Geolocation은 위도경도 (Latitude, Longitude)를 뜻한다. 여기서 얻어지는 위도와 경도값은 굉장히 부정확하다. 그 이유는 ISP(인터넷 공급자)가 제공한 데이터를 이용하기 때문이다. 따라서 현재 위치는 서울이지만 조회 결과가 경기도로 나타날 수도 있다. 이

1. IP 주소 얻기

 현재 자신의 위치 정보를 얻는 방법은 [JS] HTML에서 JS를 이용하여 IP 주소 얻기를 참조하자.

2. Geolocation API 설명

 여기서 사용할 API는 ip-api.com가 제공한다. 이 사이트는 별도의 회원가입이나, 키발급 없이 바로 조회를 할 수 있다. 다만 분당 150회의 제한이 있으니 확인하기 바란다. 또한 영리의 목적으로 사용할 수 없다.

 우리가 위치 정보를 얻기 위해서 전달해야하는 정보는

http://ip-api.com/json/123.123.123.123?callback=yourfunction

 ip는 당연히 전달되어야 하고, callback은 선택사항인데, ip-api의 서버가 response할 때, client 스크립트 내의 함수를 호출해준다.

 즉, 조회후 데이터를 출력하는 함수가 printDataOnThePage()라면, printDataOnThePage를 입력하면 된다.

3. IP를 이용하여, Geolocation 정보 얻기

 IP를 이용하여, Geolocation을 얻기위해서는 동기(synchronous)방식으로 전달해도 되지만, 대부분 비동기(asynchronous)를 이용할 것이다.

전체적인 과정을 나타내면,

 (1) IP 주소를 얻는다.

 (2) AJAX를 통하여, ip-api 서버에 비동기 통신으로 Geolocation을 요청한다.

 (3) 결과를 제공받아 화면에 출력한다.

아래의 예제를 보자.

[코드]

<div style="padding-left: 60px;">
  ip : <input id="your-ip-addr" type="text" />
  Geo : <input id="your-geo" type="text" />
  <script type="text/javascript">
    function loadScript(url, callback){
      var script = document.createElement("script")
      script.type = "text/javascript";

      if (script.readyState){  //IE
        script.onreadystatechange = function(){
          if (script.readyState == "loaded" ||
                script.readyState == "complete"){
               script.onreadystatechange = null;  
               callback();
          }
        };
      }else {  //Others
         script.onload = function(){
            callback();
         };
      }
      script.src = url;
      document.getElementsByTagName("head")[0].appendChild(script);
    }
    loadScript("https://jsonip.com/?callback=ip", function(){
      var geoData, ipData = ip;
      document.getElementById("your-ip-addr").value=ipData;
      document.getElementById("your-geo").value="Wait..";
    
      var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          geoData = JSON.parse(this.responseText);
          printDataOnThePage();
        }
       };
      xhttp.open("GET", 
                 "http://ip-api.com/json/"+ipData,
                 true);
      xhttp.send();
      function printDataOnThePage(){
        document.getElementById("your-geo").value=
          geoData.lat+' '+geoData.lon+' '+geoData.city;
      }    
    });

  </script>
</div>

AJAX를 잘 모른다면, W3School AJAX를 먼저 보자. 우선 ip주소 스크립트를 로딩하기 전에 실행될 수 있으므로, 스크립트를 로딩후에 함수를 동작하게 하는 "loadScript"부분을 추가하였다. 이부분이 잘 이해가 되지않는다면, 전체를 긁어다가 쓰면된다.  그건 각자가 알아서 해결하면될 문제이고, 간단히 ip를 받아서 Ajax를 통해 ip-api서버로 요청을 보내고 그 결과를 input 태그에 담는다.

모르겠다면 댓글로

posted by 궁금한 포도알77
2019.03.28 22:35 프로그래밍/Python

C언어로 구현되어 있는 Modbus CRC16 코드는 아래의 링크를 참고하면 된다.

http://www.modbustools.com/modbus_crc16.htm

 

이 코드를 파이썬으로 포팅해야하는 이유가 생겨서 CRC16을 파이썬3에서 구할 수 있도록 코딩하였다. 상세한 내용은 코드를 참고하길 바란다.

 

 

 

 
# This code is ported from modbus CRC16(https://www.modbustools.com/modbus_crc16.htm)

crcTable=[0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040]

# default returned value is array
# If second param is True then returning single value
def crc16(data, byInt = False):
    crc= [0xff, 0xff];
    for datum in data:
        ncrc = crcTable[(crc[0] ^ datum)]
        crc[0] = (ncrc & 0x00FF) ^ crc[1]
        crc[1] = ncrc >> 8
    if(byInt):
        return crc[0]*256 + crc[1];
    return crc

## USAGE
res = crc16([0x7E, 0x01, 0x01])
print ("Returning an array [%s] %2x %2x" %(', '.join(str(x) for x in res), res[0], res[1]))
res = crc16([0x7E, 0x01, 0x01], True)
print ("Returning single value %d %2x %2x" %(res, res>>8, res & 0xff))

posted by 궁금한 포도알77
prev 1 2 3 next