C# - tip 모음
System.BitConverter
byte에서 short로 변환하기
http://msdn.microsoft.com/ko-kr/library/system.bitconverter.toint16.aspx
BitConverter.ToInt16
스트링을 바인트로 변환
//the below code converts byte[] type string type
string txt = System.Text.Encoding.GetEncoding("utf-8").GetString(bytes);
//using Default Encoding
string txt = System.Text.Encoding.Default.GetString(msg2.getData());
다른 클래스에 있는 const로 정의한 상수를 이용 방법
// 상수는 다음과 같이 정의 되어 있다.
public class PacketDefine
{
Public const int Packet_First = 0;
………..
}
//이것을 Command 클래스에서 사용 할려면
{
// …………
int packetfirst = PacketDefine.Packet_First;
// ………….
}
데이터 변환
데이터 변환을 위해서는 Convert의 멤버를 사용한다.
// Convert.Toxxx( xxx )를 사용하면 된다. 예) 스트링을 int 변환
{
Convert.ToInt32( string );
}
바이트 배열을 지정된 위치와 크기로 복사할 경우
{
Buffer.BlockCopy( ……. );
}
클래스의 크기를 알고 싶을 때
{
Marshal.SizeOf(LoginPacket)
}
//LoginPacket는 인스턴스 화된 객체이어야만 한다. LoginPacket의 클래스인 LOGIN_PACKET를 사용하면 안된다.
한글 파일 출력 문제
정확한 이유는 모르지만 한글을 파일에 입력할 때 인코딩을 Default 방식으로 지정하면 한글 XP에서는 한글을 아스키 코드 값으로 제대로 인식하지만 윈도우 2003에서는 한글을 유니코드 방식으로 인식하여 한글 1글자를 아스키 코드 1글자로 인식하는 경우가 있다.
{
string strValue = “개”;
encodedBytes = System.Text.Encoding.Default.GetBytes(strValue);
}
한글 XP에서 읽는다면 encodedBytes의 길이가 2개로 나오지만 윈도우 2003에서는 길이가 1로 된다.
이 문제를 해결할려면 인코딩 방식을 명시적으로 지정해야 된다.
{
string strValue = “개”;
encodedBytes = System.Text.Encoding.GetEncoding(949).GetBytes(strValue);
}
한글이 포함된 Ansi 문자열을 유니코드 문자열로 변환하기
{
byte[] data;
string s = System.Text.Encoding.GetEncoding(949).GetString(data);
}
네이티브의 time(&time_t)에서 얻은 초단위의 시간을 C#에서 사용
time함수를 이용하여 얻은 시간은 시작이 1970년부터이고 C#의 경우는 0년 1월1일 부터이다..그래서 서로 호환이 되지 않느다. 이것을 해결할려면 다음과 같이 하면 된다.
{
int iTime = C타임함수값;
DateTime dt = new DateTime(1970, 1, 1, 9, 0, 0); // 한국은 GMT+9시간
dt = dt.AddSeconds(iTime);
}
로그 메시지 출력을 위한 가변인수와 매크로
C++에서는 로그를 남기기 위해 로그 라이브러리를 만들 때 꼭 사용하는 것이 가변인수와 매크로입니다.
//가변인수를 사용하여
void LogMessage( LPCTSTR format, ... )
{
char SBody[ MAX_PATH ] = { 0, };
va_list strlist;
va_start( strlist, format );
_vsntprintf_s( SBody, _countof(SBody), _TRUNCATE, format, strlist );
va_end( strlist );
}
이런 식으로 하나의 메시지를 만들고
이 LogMessage함수를 어디서, 언제 호출했는지 알리는 방법은 FILE, LINE, FUNCTION 와 같은 매크로를 사용합니다.
이런 기능을 닷넷에서 구현하려면 가변인수는 다음과 같은 방식으로 구현 합니다.
public void print(int i, params string[] messages)
{
string logmsg;
foreach(string msg in messages)
logmsg += msg;
}
// 그리고 __FILE__, __LINE__, __FUNCTION__ 매크로는 닷넷의 어트리뷰트를 사용합니다.
using System.Runtime.CompilerServices;
using System.Diagnostics;
void LogToUI(string logText,
[CallerFilePath] string fileName = "",
[CallerMemberName] string methodName = "",
[CallerLineNumber] int lineNumber = 0)
{
string logmsg = string.Format("[줄:{0}|호출:{1}|시간{2}] : {3}", lineNumber, methodName, DateTime.Now.ToShortTimeString(), logText);
listBoxLog.Items.Add(logmsg);
}
// 사용
LogToUI("서버 생성 성공");
이 글은 2019-06-01에 작성되었습니다.