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