Как передать массив байтов в качестве указателя в C # - PullRequest
1 голос
/ 28 марта 2009

У меня два вопроса. Они оба касаются пустоты в 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? Как использовать его как массив?

Второй вопрос:

Как использовать LOBYTE, HIBYTE, LOWORD, HIWORD в C #?

EDIT

Вот как вызывается функция: Код C ++

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

keyArray - это DWORD (UInt32), dwArgs - это массив dword.KeyByte - это байт.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 28 марта 2009

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 голос
/ 28 марта 2009

[...] что такое LPBYTE? Как использовать его как массив?

Это указатель на BYTE: определение типа, обычно для unsigned char. Вы используете его так же, как и unsigned char*, чтобы указать на первый элемент массива беззнаковых символов. Определено в windef.h:

typedef unsigned char       BYTE;    
typedef BYTE far            *LPBYTE;

Как использовать LOBYTE, HIBYTE, LOWORD, HIWORD в C #?

Это макросы для извлечения частей 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 #.

1 голос
/ 28 марта 2009

LPBYTE означает Длинный указатель на байт, так что это фактически массив байтов.

Если у вас есть uint32, u (нужно быть осторожным, меняя подписанные количества):

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

предполагает, что установлены только нижние 16 бит (т. Е. Верхние 16 бит ноль):

LOBYTE(b) = (b & 0xFF);
HIBYTE(b) = (b >> 8);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...