2009-03-28 5 views
1

두 가지 질문이 있습니다. 둘 다 C++에서 void를 사용하고 있는데, 이는 C#으로 번역하려고합니다.C#에서 포인터로 바이트 배열을 전달하는 방법

C++ 코드

void Func_X_2(LPBYTE stream, DWORD key, BYTE keyByte) 
{ 
stream[0] ^= (stream[0] + LOBYTE(LOWORD(key)) + keyByte); 
stream[1] ^= (stream[1] + HIBYTE(LOWORD(key)) + keyByte); 
stream[2] ^= (stream[2] + LOBYTE(HIWORD(key)) + keyByte); 
stream[3] ^= (stream[3] + HIBYTE(HIWORD(key)) + keyByte); 
stream[4] ^= (stream[4] + LOBYTE(LOWORD(key)) + keyByte); 
stream[5] ^= (stream[5] + HIBYTE(LOWORD(key)) + keyByte); 
stream[6] ^= (stream[6] + LOBYTE(HIWORD(key)) + keyByte); 
stream[7] ^= (stream[7] + HIBYTE(HIWORD(key)) + keyByte); 
} 

첫 번째 질문 :

DWORD 바이트가 바이트, UINT32,하지만 LPBYTE은 무엇인가? 그것을 배열로 사용하는 방법?

두 번째 질문 :

어떻게 C#으로 LOBYTE, HIBYTE, LOWORD, HIWORD를 사용하는?

EDIT

이 함수가 호출되는 방식이다 C++ 코드

Func_X_2((LPBYTE)keyArray, dwArgs[14], keyByte); 

keyArray는 DWORD (UINT32)이다 dwArgs는 dword.KeyByte의 배열 바이트이다.

미리 감사드립니다.

답변

2

LPBYTE는 바이트 배열에 대한 포인터입니다. C#에서 이와 동등한 변수는 byte [] 유형의 변수입니다. 그래서 당신과 같이 함수를 번역 할 수 있습니다 : keyarray2가 배열 인 경우

public static void Func_X_2(byte[] stream, int key, byte keyByte) 
{ 
    stream[0] ^= (byte)(stream[0] + BitConverter.GetBytes(LoWord(key))[0]); 
    stream[1] ^= (byte)(stream[1] + BitConverter.GetBytes(LoWord(key))[1]); 
    stream[2] ^= (byte)(stream[2] + BitConverter.GetBytes(HiWord(key))[0]); 
    stream[3] ^= (byte)(stream[3] + BitConverter.GetBytes(HiWord(key))[1]); 
    stream[4] ^= (byte)(stream[4] + BitConverter.GetBytes(LoWord(key))[0]); 
    stream[5] ^= (byte)(stream[5] + BitConverter.GetBytes(LoWord(key))[1]); 
    stream[6] ^= (byte)(stream[6] + BitConverter.GetBytes(HiWord(key))[0]); 
    stream[7] ^= (byte)(stream[7] + BitConverter.GetBytes(HiWord(key))[1]); 
} 

public static int LoWord(int dwValue) 
{ 
    return (dwValue & 0xFFFF); 
} 

public static int HiWord(int dwValue) 
{ 
    return (dwValue >> 16) & 0xFFFF; 
} 
+0

어떻게 기능 Func_X_2를 호출 [2] DWORD의? –

1

LPBYTE는 Long Pointer to Byte의 약자이므로 효과적으로 Byte 배열입니다. 당신이 UINT32이있는 경우

, 유 (주의 이동이 양을 체결해야) :

LOWORD(u) = (u & 0xFFFF); 
HIWORD(u) = (u >> 16); 

설정 만 아래 16 비트를 가정합니다 (즉, 상위 16 비트는 제로.) :

LOBYTE(b) = (b & 0xFF); 
HIBYTE(b) = (b >> 8); 
1

[...] LPBYTE 란 무엇입니까? 그것을 배열로 사용하는 방법?

에 대한 포인터입니다. 일반적으로 unsigned char에 대한 typedef입니다. 부호없는 문자 배열의 첫 번째 요소를 가리 키도록 unsigned char*을 사용하는 것처럼이 코드를 사용합니다. 그것은 windef.h에 정의되어

typedef unsigned char  BYTE;  
typedef BYTE far   *LPBYTE; 

어떻게 C#으로 LOBYTE, HIBYTE, LOWORD, HIWORD를 사용할 수 있나요?

WORD 부분을 가져 오는 매크로입니다. 이들은 구현하기가 매우 쉽습니다 (bit-fiddling operatios처럼). 또한 windef.h에 정의되어 있습니다. 당신은 단순히 정의를 꺼내 사용자 정의 C#을 기능에 붙여 넣을 수 있습니다 :

#define LOWORD(l)   ((WORD)((DWORD_PTR)(l) & 0xffff)) 
#define HIWORD(l)   ((WORD)((DWORD_PTR)(l) >> 16)) 
#define LOBYTE(w)   ((BYTE)((DWORD_PTR)(w) & 0xff)) 
#define HIBYTE(w)   ((BYTE)((DWORD_PTR)(w) >> 8)) 

당신은 this은 SO C#에서 비트 조작에 대한 사후보고 할 수 있습니다.