반응형
C#에서 WORD, DWORD와 비슷한 개념을 처리하기 위한 방법과, 관련된 매크로를 C# 코드로 변환하는 예제를 제공하겠습니다. C#에서는 #define 매크로를 직접 사용할 수 없지만, 대신 메서드나 표현식으로 대체할 수 있습니다.
1. WORD와 DWORD 데이터 타입
C#에서 WORD는 보통 ushort (2바이트, 16비트)로, DWORD는 uint (4바이트, 32비트)로 사용됩니다.
- ushort: 16비트 부호 없는 정수
- uint: 32비트 부호 없는 정수
2. LOWORD와 HIWORD
LOWORD와 HIWORD는 DWORD에서 하위 16비트와 상위 16비트를 추출하는 매크로입니다. 이를 C#에서는 메서드로 변환할 수 있습니다.
LOWORD
public static ushort LOWORD(uint l)
{
return (ushort)(l & 0xFFFF);
}
HIWORD
public static ushort HIWORD(uint l)
{
return (ushort)((l >> 16) & 0xFFFF);
}
- l & 0xFFFF: 하위 16비트를 추출
- (l >> 16) & 0xFFFF: 상위 16비트를 추출
3. LOBYTE와 HIBYTE
LOBYTE와 HIBYTE는 16비트 값에서 하위 8비트와 상위 8비트를 추출하는 매크로입니다.
LOBYTE
public static byte LOBYTE(ushort w)
{
return (byte)(w & 0xFF);
}
HIBYTE
public static byte HIBYTE(ushort w)
{
return (byte)((w >> 8) & 0xFF);
}
- w & 0xFF: 하위 8비트를 추출
- (w >> 8) & 0xFF: 상위 8비트를 추출
4. MAKEWORD와 MAKELONG
MAKEWORD와 MAKELONG은 두 개의 작은 단위 값(BYTE 또는 WORD)을 결합하여 더 큰 데이터 타입(WORD 또는 DWORD)을 만드는 매크로입니다.
MAKEWORD
public static ushort MAKEWORD(byte a, byte b)
{
return (ushort)((b << 8) | a);
}
- b << 8: b를 8비트 왼쪽으로 이동시켜 상위 8비트로 만들고, a와 결합합니다.
MAKELONG
public static uint MAKELONG(ushort a, ushort b)
{
return (uint)((b << 16) | a);
}
- b << 16: b를 16비트 왼쪽으로 이동시켜 상위 16비트로 만들고, a와 결합합니다.
5. 예시 코드
아래는 위에서 정의한 메서드를 사용하는 예시입니다:
using System;
class Program
{
public static ushort LOWORD(uint l)
{
return (ushort)(l & 0xFFFF);
}
public static ushort HIWORD(uint l)
{
return (ushort)((l >> 16) & 0xFFFF);
}
public static byte LOBYTE(ushort w)
{
return (byte)(w & 0xFF);
}
public static byte HIBYTE(ushort w)
{
return (byte)((w >> 8) & 0xFF);
}
public static ushort MAKEWORD(byte a, byte b)
{
return (ushort)((b << 8) | a);
}
public static uint MAKELONG(ushort a, ushort b)
{
return (uint)((b << 16) | a);
}
static void Main()
{
// Example usage
uint dword = 0xABCD1234;
ushort low = LOWORD(dword);
ushort high = HIWORD(dword);
Console.WriteLine($"LOWORD: {low:X4}");
Console.WriteLine($"HIWORD: {high:X4}");
ushort word = 0x1234;
byte lowByte = LOBYTE(word);
byte highByte = HIBYTE(word);
Console.WriteLine($"LOBYTE: {lowByte:X2}");
Console.WriteLine($"HIBYTE: {highByte:X2}");
byte a = 0xAB;
byte b = 0xCD;
ushort combinedWord = MAKEWORD(a, b);
Console.WriteLine($"MAKEWORD: {combinedWord:X4}");
ushort wordA = 0x1234;
ushort wordB = 0x5678;
uint combinedLong = MAKELONG(wordA, wordB);
Console.WriteLine($"MAKELONG: {combinedLong:X8}");
}
}
출력 예시
LOWORD: 1234
HIWORD: ABCD
LOBYTE: 34
HIBYTE: 12
MAKEWORD: CDAB
MAKELONG: 56781234
결론
C#에서 WORD, DWORD 같은 데이터 타입을 사용할 때는 ushort와 uint를 사용하고, 이를 처리하는 매크로를 메서드로 변환하여 하위 비트, 상위 비트를 추출하거나 두 값을 합치는 작업을 할 수 있습니다. 이렇게 변환한 메서드는 비트 연산을 안전하고 효율적으로 처리할 수 있도록 도와줍니다.
반응형
'C#' 카테고리의 다른 글
재미로 만드는 로또 번호 생성기 #1_중복 없는 번호 생성 (0) | 2025.01.04 |
---|---|
C#의 Garbage Collection (GC) 개념 (5) | 2025.01.03 |
C#로 특정 폴더 내 파일 이름 변경 (1) | 2025.01.03 |
WNetUseConnection 함수의 리턴값과 오류 코드 목록 (1) | 2025.01.03 |
C# ThreadPool: 스레드 관리와 작업 처리 최적화 (1) | 2024.12.30 |
로컬 IP 127.0.0.1의 기본 포트 확인 및 설정 방법 (0) | 2024.12.30 |
C# Thread.Priority 속성 (1) | 2024.12.27 |
"C# 파일 복사 함수에서 불필요한 BinaryReader와 BinaryWriter 객체 사용에 대한 분석" (0) | 2024.12.26 |