【发布时间】:2017-02-21 19:51:21
【问题描述】:
我有一些 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++??
【问题讨论】:
-
HexToByte 参数在 C# 中应该只是一个字节数组。
-
是的,但是如何在该字节数组中传递特定索引,就像在上面的 C++ 代码中所做的那样?此外,HexToByte 是在很多地方使用的通用函数。
-
您应该将十进制 ASCII 数字替换为它们的等效字符,例如
'A'而不是 65。 -
我为什么要这样做?我认为这是一个建议,因为它实际上并不能解决我的问题。
-
HexToByte可能需要更改为HexToByte(byte[] buffer, int index)。