C#을 다루면서 비트를 다룰 때 생각보다 많이 사용하게되는 BitConverter
입니다.
데이터를 바이트 배열로 변환하거나 바이트 배열을 데이터로 변환하여 전달할 때 많이 쓰입니다.
BitConverter Class
//
// 요약:
// Converts base data types to an array of bytes, and an array of bytes to base
// data types.
public static class BitConverter
BitConverter
는 static class
의 형태로 내부의 함수들 또한 static 함수
로 이루어져 있습니다.
BitConverter에서 자주 쓰이는 함수 (데이터를 Byte 배열로 변환)
// bool 값을 byte[]로 변환
public static byte[] GetBytes(bool value);
bool bValue = true;
byte[] bytes = BitConverter.GetBytes(bValue); // 0x01
// char 값을 byte[]로 변환
public static byte[] GetBytes(char value);
char ch = 'A';
byte[] bytes = BitConverter.GetBytes(ch); // 0x0041
// short 값을 byte[]로 변환
public static byte[] GetBytes(short value);
short sNum = short.MaxValue;
byte[] bytes = BitConverter.GetBytes(sNum); // 0x7FFF
// ushort 값을 byte[]로 변환
public static byte[] GetBytes(ushort value);
ushort usNum = ushort.MaxValue - 10;
byte[] bytes = BitConverter.GetBytes(usNum); // 0xFFF5
// int 값을 byte[]로 변환
public static byte[] GetBytes(int value);
int nNum = 21883746;
byte[] bytes = BitConverter.GetBytes(nNum); // 0x014DEB62
// uint 값을 byte[]로 변환
public static byte[] GetBytes(uint value);
uint unNum = 12345678;
byte[] bytes = BitConverter.GetBytes(unNum); // 0x00BC614E
// long 값을 byte[]로 변환
public static byte[] GetBytes(long value);
long lNum = 6892731L;
byte[] bytes = BitConverter.GetBytes(lNum); // 0x0000000000692CBB
// ulong 값을 byte[]로 변환
public static byte[] GetBytes(ulong value);
ulong ulNum = 483719208173UL;
byte[] bytes = BitConverter.GetBytes(ulNum); // 0x000000709FE95CED
// float 값을 byte[]로 변환
public static byte[] GetBytes(float value);
float fNum = 123.456f;
byte[] bytes = BitConverter.GetBytes(fNum); // 0x42F6E979
// double 값을 byte[]로 변환
public static byte[] GetBytes(double value);
double dNum = 3.141592;
byte[] bytes = BitConverter.GetBytes(dNum); // 0x400921FAFc8B007A
BitConverter 에서 자주 쓰이는 함수 (Byte 배열을 자료형 데이터 변환)
// byte[]를 bool형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static bool ToBoolean(byte[] value, int startIndex);
bool bValue = BitConverter.ToBoolean(bytes, 0);
// byte[]를 char형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static char ToChar(byte[] value, int startIndex);
char ch = BitConverter.ToChar(bytes, 0);
// byte[]를 short형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static short ToInt16(byte[] value, int startIndex);
short sNum = BitConverter.ToInt16(bytes, 0);
// byte[]를 ushort형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static ushort ToUInt16(byte[] value, int startIndex);
ushort usNum = BitConverter.ToUInt16(bytes, 0);
// byte[]를 int형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static int ToInt32(byte[] value, int startIndex);
int nNum = BitConverter.ToInt32(bytes, 0);
// byte[]를 uint형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static uint ToUInt32(byte[] value, int startIndex);
uint unNum = BitConverter.ToUInt32(bytes, 0);
// byte[]를 long형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static long ToInt64(byte[] value, int startIndex);
long lNum = BitConverter.ToInt64(bytes, 0);
// byte[]를 ulong형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static ulong ToUInt64(byte[] value, int startIndex);
ulong lNum = BitConverter.ToUInt64(bytes, 0);
// byte[]를 float형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static float ToSingle(byte[] value, int startIndex);
float fNum = BitConverter.ToSingle(bytes, 0);
// byte[]를 double형 데이터로 (startIndex는 value의 변환 시작 인덱스)
public static double ToDouble(byte[] value, int startIndex);
double dNum = BitConverter.ToDouble(bytes, 0);
Big Endian과 Little Endian
Big Endian과 Little Endian은 위와 같다는 것을 우리는 알고 있습니다.
그럼 현재 프로그램을 구동하고 있는 PC의 Endian 형태는 어떻게 알 수 있을까요?
BitConverter
는 IsLittleEndian
이라는 필드를 제공하고 있습니다.
// This field indicates the "endianess" of the architecture.
// The value is set to true if the architecture is
// little endian; false if it is big endian.
#if BIGENDIAN
[Intrinsic]
public static readonly bool IsLittleEndian /* = false */;
#else
[Intrinsic]
public static readonly bool IsLittleEndian = true;
#endif
물론 Visual Studio를 실행하는 대다수의 컴퓨터는 LittleEndian 임으로 true
를 반환 할 것입니다.
예제
'Study > C#, Winform' 카테고리의 다른 글
[C#, Winform] Cross Thread(UI Thread) 처리, InvokeRequired (0) | 2024.05.26 |
---|---|
[C#] 바이트 배열을 이용한 비트 다루기 : BitArray (0) | 2023.07.15 |
[C# Winform] PropertyGrid 에서 DisplayName 우선순위 (0) | 2022.12.26 |
[C#] 배열 정렬 기능 (Sort) (0) | 2022.12.10 |
[C# Winform] DataGridView Column Header Drag (컬럼 헤더 드래그) (0) | 2022.10.24 |