1

我有两个问题。它们都与 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,BYTE 是字节,但 LPBYTE 是什么?如何将其用作数组?

第二个问题:

如何在 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,你(必须小心移动有符号数量):

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: 类型定义的指针,通常用于unsigned char. 您可以像使用 an 一样使用它unsigned char*来指向无符号字符数组的第一个元素。它定义在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))

您可能还想查看这篇SO 帖子以了解 C# 中的位操作。

于 2009-03-28T08:37:51.947 回答