일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- tcp
- json
- install
- 리뷰
- Close
- bitcoin
- go언어
- channel
- API
- FOR
- mutex
- GO 언어
- window
- http
- Callback
- JavaScript
- C
- Golang
- windows
- 책
- write
- Linux
- File
- 영화
- range
- Python
- package
- c++
- Sync
- go
- Today
- Total
목록C (8)
Code Habit
최근 직무가 Client 개발에서 Server로 변경 되었다. Codec 관련 업무를 맏고 있는데 Metadata나 헤더 파싱하는데 bit 단위로 접근해야 하는 경우가 많더라.. 하여 간단하게 Bit값 읽어오는 함수 두개를 만들어 보았다. - 1Byte의 데이터를 입력 받아 index 번째 있는 bit 값을 가져오는 함수이다 ( 0 or 1 ) UINT8 GetBit(UINT8 nData, UINT nIndex) { if (8 8) { return 0; } int nOut = 0; for (int i = nIndex; i < nEnd; i++) { nOut = (nOut
has-a 모델의 두개의 클래스 간 정보를 주고 받기 위해서는 callback을 활용할 수 있다. 예를들어 class A가 class B를 갖고 있다고 하자. A클래스 객채에서는 B클래스에 있는 변수나 함수를 사용하기 용이하지만 B클래스 객체에서는 A클래스에 접근하기 힘들다. 이럴때 callback을 이용하여 B클래스에서 A클래스에 있는 변수나 함수에 접근할 수 있다. ( 보통 B클래스 작업을 마무리 하고 A클래스에 통보할 일이 필요할 때 이를 활용하게 된다.) ex) class Callback { public: // 구현은 이를 상속하는 클래스에서 하기 때문에 // virtual 즉, 가상의 함수로 선언한다. virtual void done() = 0; }; class B { public: // cal..
개발을 하다보면 부하가 걸리는 부분의 로직별 수행시간을 측정할 필요가 있다. 다음 소스를 사용하면 ms(마이크로세컨드) 단위로 수행속도를 측정할 수 있다. #include #include int main(void) { clock_t start, end; start = clock(); // 수행할 로직 end = clock(); printf("%f\n", ((double)(end-start)) / CLOCKS_PER_SEC); } CLOCKS_PER_SEC은 ms(마이크로세컨드)를 s(초)단위로 변경할 때 쓰이는 매크로 상수이다.
* 유니코드 -> 멀티바이트 wchar_t strUni[256] = L"유니코드"; char strUtf8[256] = { 0, }; int nLen = WideCharToMultiByte(CP_UTF8, 0, strUni, lstrlenW(strUni), NULL, 0, NULL, NULL); WideCharToMultiByte(CP_UTF8, 0, strUni, lstrlenW(strUni), strUtf8, nLen, NULL, NULL); * 멀티바이트 -> 유니코드 wchar_t strUnicode[256] = { 0, }; char strMultibyte[256] = { 0, }; wcscpy_s(strUnicode, 256, L"유니코드"); int len = WideCharToMultiBy..
파일을 I/O를 활용하여 리스트 정보(고객 명단 등)를 간단하게 로컬에 저장하고 읽고 싶을 때 fgets/fputs 함수를 사용하면 쉽게 구현할 수 있다. fputs 함수로 파일에 한줄 단위로 문자열을 저장하고 저장된 문자열을 줄별로 다시 fgets 함수로 읽어 들일 수 있다. 참고로 필자는 개발한 프로그래밍의 블랙리스트 명단을 로컬에 저장하고 읽어들이기 위해 위의 함수들을 활용하였다. 예제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include int main(void) { // 파일 쓰기모드 생성/열기 FILE *fp = fopen("test.txt", "w"); if (NULL == fp) { return -1; } fputs("1 line\n", fp); ..
c언어 함수인 fopen을 이용해 파일을 열고 파일의 크기를 먼저 구한 후 크기만큼 파일을 읽는 예제이다. 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 int main(void) { char* buffer; int size; int count; FILE *fp = fopen("test.txt", "r"); if (NULL == fp) { return -1; } fseek(fp, 0, SEEK_END); // 파일 포인터를 파일의 끝으로 이동시킴 size = ftell(fp); // 파일 포인터의 현재 위치를 얻음 => 파일 사이즈 buffer = new char[size+1]; // 파일 크기 + 1바이트(문자열 마지막의 NULL)..
go 로 작성된 서버/클라이언트 끼리 구조체 데이터를 주고 받고 싶으면 "gob"패키지 같은 go에서 제공하는 패키지를 사용하면 편리하다. 그런데 만약 go로 서버를 만들되 클라이언트를 다른언어 ( c ) 로 만들게 되면 위와 같은 패키지는 사용할 수 없게 된다. 이렇게 되면 문제가 하나 발생하는데 go에서는 포인터 개념도 없고, 문자열을 표현하는 string 자료형이 가변이라 약속된 크기의 데이터를 주고 받기가 꽤 까다롭다는 것이다. 그래서 필자는 아래와 같은 두가지 방법을 생각해 보았다. 1. 사이즈 전송 후 구조체 데이터를 json데이터로 전송 2. 사이즈 전송 후 구조체 데이터의 각 필드를 고정된 크기의 []byte형으로 전송 네트워크 통신에서 (특히 http 통신)에서 많이 사용하는 json 데..
배열을 매개변수로 전달할때 포인터 변수를 사용하여 (시작)주소값을 전달하게 되는데 이 때 우리는 배열의 크기를 같이 전달해야 한다. 원래 배열의 크기는 sizeof()함수로 구할 수 있으나 매개변수로 전달될 때 포인터 변수로 받기 때문에 이를 sizeof() 함수로 처리 할 시 포인터 변수의 크기가 구해지기 때문이다. 즉 매개변수로 배열을 전달할 때는 꼭 크기도 같이 전달하자 ! void func( int* p, int nSize ); void main() { int n[100] = {0, }; printf( "%d\n", sizeof(n) ); // 400 : 4(int) * 100 func(n, 100); // 배열 n 과 사이즈 전달} void func( int* p, int nSize ) // i..