【问题标题】:Converting C++ to C#: Passing pointers to functions将 C++ 转换为 C#:将指针传递给函数
【发布时间】: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)

标签: c# c++ pointers


【解决方案1】:

@tinstaafl 感谢您的建议

在 C++ 代码中,参数是指向字节数组中特定元素的指针(即某个起始地址)。在函数 '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]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2011-04-17
    • 2011-05-22
    • 1970-01-01
    • 2020-01-09
    • 2019-03-12
    相关资源
    最近更新 更多