如何在C#中将字节数组作为指针传递

时间:2009-03-28 08:27:57

标签: c# lpbyte

我有两个问题。他们都关注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是一个字节。

提前致谢。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

LPBYTE代表长指针到字节,因此它实际上是一个字节数组。

如果你有一个uint32,你(必须小心移动签名数量):

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

假设只设置了16位(即前16位为零):

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

答案 2 :(得分:1)

  

[...]什么是LPBYTE?如何将它用作数组?

它是指向BYTE的指针:typedef,通常用于unsigned char。您可以像使用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))

您可能还希望查看this SO帖子中的C#中的位操作。