2017-02-21 201 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]);