1

2 つの質問があります。どちらも C++ の void に関するもので、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、BYTE はバイトですが、LPBYTE とは何ですか? 配列として使用する方法は?

2 番目の質問:

C#でLOBYTE、HIBYTE、LOWORD、HIWORDを使用するには?

編集

これは、関数が呼び出される方法です: C++ コード

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

keyArray は DWORD(UInt32)、dwArgs は dword の配列、KeyByte はバイトです。

前もって感謝します。

4

3 に答える 3

2

LPBYTE は、バイト配列へのポインタです。C# でこれに相当するのは、byte[] 型の変数です。したがって、関数を次のように翻訳できます。

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;
}
于 2009-03-28T08:59:26.077 に答える
1

LPBYTE は Long Pointer to Byte の略なので、事実上 Byte 配列です。

uint32 がある場合、u (符号付きの数量を慎重にシフトする必要があります):

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

下位16ビットのみが設定されていると仮定します(つまり、上位16ビットはゼロ):

LOBYTE(b) = (b & 0xFF);
HIBYTE(b) = (b >> 8);
于 2009-03-28T08:36:44.553 に答える
1

[...] LPBYTE とは何ですか? 配列として使用する方法は?

これは へのポインタBYTEです: typedef で、通常はunsigned char. unsigned char*符号なし文字の配列の最初の要素を指すためにan を使用するのと同じように使用します。で定義されていwindef.hます。

typedef unsigned char       BYTE;    
typedef BYTE far            *LPBYTE;

C#でLOBYTE、HIBYTE、LOWORD、HIWORDを使用するには?

これらは、 の一部を取得するためのマクロWORDです。それらは非常に簡単に実装できます (ビットをいじる操作として)。これらは にも定義されてい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))

C# でのビット操作については、この SO 投稿も参照してください。

于 2009-03-28T08:37:51.947 に答える