我有两个问题。他们都关注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是一个字节。
提前致谢。
答案 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#中的位操作。