2017-02-21 7 views
-4

У меня есть код C++, который я пытаюсь преобразовать в C#, но я не совсем понимаю, что происходит.Преобразование C++ в C#: Передача указателей на функции

Здесь C++ код:

BYTE buffer[150]; // byte is of type ‘unsigned char’ 
int i; 
checksum = 0; 


for (i = 0; i < count; i++) 
    checksum += HexToByte(&buffer[2 + i * 2]);//HOW DO I PASS THIS ARGUMENT 
checksum = ~checksum; 

BYTE HexToNibble(BYTE HexChar){ 
    if ((HexChar >= 48) && (HexChar <= 57)) return HexChar - 48; 
    if ((HexChar >= 65) && (HexChar <= 70)) return HexChar - 55; 
    if ((HexChar >= 97) && (HexChar <= 102)) return HexChar - 87; 
    return 0; 
} 

BYTE HexToByte(BYTE* HexPtr){ 
    return HexToNibble(HexPtr[0]) * 0x10 + HexToNibble(HexPtr[1]); //AND USE THE ARGUMENT LIKE THIS 
} 

Моя путаница относительно того, как функция 'HexToByte' использует указатель. Похоже, что мы передаем указатель на определенный индекс массива буфера, но затем продолжаем использовать его, как если бы он был массивом?

При преобразовании этого кода в C# я не уверен, каким должен быть параметр для функции HexToByte?

Любая помощь/ясность в отношении ситуации будет оценена по достоинству.

Вот моя реализация кода (который не работает)

// Modified C++ code 
     // Arrays are reference types in .NET framework so I don't need to pass a pointer. 
    public static byte HexToByte(byte[] buffer) 
    { 
     return HexToNibble((byte)((buffer[0] * 0x10) + HexToNibble(buffer[1]))); 
    } 

private static byte HexToNibble(byte HexChar) 
{ 
    if ((HexChar >= 48) && (HexChar <= 57)) 
     return (byte)(HexChar - 48); 
    if ((HexChar >= 65) && (HexChar <= 70)) 
     return (byte)(HexChar - 55); 
    if ((HexChar >= 97) && (HexChar <= 102)) 
     return (byte)(HexChar - 87); 
    return 0; 
} 


checksum = 0; 
for (int j = 0; j < count; j++) 
    checksum += utils.HexToByte(buffer[2 + i * 2]); // can't pass this argument ??? WHY CAN I DO THIS IN C++?? 
+0

Параметр HexToByte должен быть просто байтовый массив в C#. –

+0

Да, но как мне передать конкретный индекс в этом массиве байтов, как это делается в коде на C++ выше? Кроме того, HexToByte, если общая функция используется во многих местах. –

+1

Вы должны заменить десятичные ASCII-номера символьными буквальными эквивалентами, такими как '' A'' вместо 65. –

ответ

0

@tinstaafl Спасибо за предложение

В коде C++ аргумент является указателем, который указывает на spefic элемента в пределах массив байтов (т. е. некоторый начальный адрес). В функции «HexToByte» используется тот же самый указатель, чтобы получить элемент, который он указывает, плюс следующий элемент.

Здесь C# реализация

 public static byte HexToByte(byte[] buffer, int index) 
     { 
      return HexToNibble((byte)((buffer[index] * 0x10) + HexToNibble(buffer[index + 1]))); 
     } 
     private static byte HexToNibble(byte HexChar) 
     { 
      if ((HexChar >= 48) && (HexChar <= 57)) 
       return (byte)(HexChar - 48); 
      if ((HexChar >= 65) && (HexChar <= 70)) 
       return (byte)(HexChar - 55); 
      if ((HexChar >= 97) && (HexChar <= 102)) 
       return (byte)(HexChar - 87); 
      return 0; 
     } 

// calculate the checksum 
checksum = 0; 
for (int j = 0; j < count; j++) 
    checksum += utils.HexToByte(buffer, buffer[2 + i * 2]);