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 32 33 34 35 36 37 | // 스트링을 16진수로 변경 void fnStr2Hex(char* out, char* in){ int idx; int ascii; int len = strlen(in); for(idx=0; idx<len; idx++){ sprintf(out+(idx*2), "%02x", in[idx]); } } // char hex[2] long getDecimal(char* hex){ long rtnVal; char end[4]; char *pEnd = end; rtnVal = strtol(hex, &pEnd, 16); return rtnVal; } // 스트링을 16진수로 변경 void fnHex2Str(char* out, char* in){ int idx; int outIdx; int ascii; char hex[3]; int len = strlen(in); for(idx=0; idx<len; idx+=2){ strncpy(hex, in+idx, 2); out[outIdx++] = getDecimal(hex); } } |
string to hex string in c language
Python ctypes.c_char_p의 할당 매커니즘
python에서 c 라이브러리를 바인딩하기 위한 방법으로 ctypes를 쓰게 된다.
c_char_p는 c 라이브러리의 char*를 python으로 가져오는 오브젝트이다.
c_char_p는 사용된 문자열 주소값을 참조하는걸로 추측된다.
c_char_p변수 두개를 같은 문자열로 선언하면
같은 주소값을 가르킨다.
아래 파이썬 콘솔에서 입력한 코드를 참고하여 설명하겠다.
>>> from ctypes import *
>>>
>>> string1 = c_char_p(10)
>>> string2 = c_char_p(10)
>>> print string1
c_char_p(10)
>>> string1.value = ''
>>> string2.value = ''
>>> print string1
c_char_p(4294250668)
>>> print string2
c_char_p(4294250668)
고로 스트링의 동적할당을 위해선
create_string_buffer() 를 사용하도록 한다.
c_char_p는 c 라이브러리의 char*를 python으로 가져오는 오브젝트이다.
c_char_p는 사용된 문자열 주소값을 참조하는걸로 추측된다.
c_char_p변수 두개를 같은 문자열로 선언하면
같은 주소값을 가르킨다.
아래 파이썬 콘솔에서 입력한 코드를 참고하여 설명하겠다.
>>> from ctypes import *
>>>
>>> string1 = c_char_p(10)
>>> string2 = c_char_p(10)
>>> print string1
c_char_p(10)
>>> string1.value = ''
>>> string2.value = ''
>>> print string1
c_char_p(4294250668)
>>> print string2
c_char_p(4294250668)
create_string_buffer() 를 사용하도록 한다.
C와 Python 소켓 데이터 연동
C와 Python 소켓 데이터 연동
C에서 소켓으로 스트럭쳐 데이터를 send하고Python에서 소켓으로 데이터를 받아 스트럭쳐의 밸류값을 recv, 다시 데이터를 send하는 에코 서버 로직을 구현해 보았다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | # Python server simulator # 133 사이즈의 데이터를 소켓으로 recv하고 받았던 곳으로 다시 준다. # struct.unpack시에 '='인자를 포함함으로써 padding byte를 제거 하고 C에서 # "#pragma pack(1)"과 같은 역할을 하게 한다. dataFormat = '=' dataFormat += '20s' # 스트링 20 byte dataFormat += '4s' dataFormat += '2s' dataFormat += '2s' dataFormat += '10s' dataFormat += 'c' # char 1byte dataFormat += '2s' dataFormat += '38s' dataFormat += 'c' dataFormat += 'c' dataFormat += '2s' dataFormat += '2s' dataFormat += '9s' dataFormat += '8s' dataFormat += '8s' dataFormat += '6s' dataFormat += '6s' dataFormat += '7s' dataFormat += '4s' stNiceCardInfoReq = struct.Struct( dataFormat ) # 스트럭쳐 구조에 대한 정의를 Struct() 매개변수로 돌려준다 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 8888)) sock.listen(5) while 1: cli_sock, addr = sock.accept() recvData = cli_sock.recv(133) for str in data: print str rst = cli_sock.send(recvData[:133]) print "send(%d)"%rst sock.close() # 받은 데이터 133 사이즈 패킷을 dataFormat 형식으로 마샬링(분리)한다. data = stNiceCardInfoReq.unpack(recvData) |
피드 구독하기:
글 (Atom)